gpt4 book ai didi

android - 从数据库中成功检索数据但无法通过适配器类

转载 作者:行者123 更新时间:2023-11-29 02:23:01 26 4
gpt4 key购买 nike

好吧...我想在 RecycleView 中显示从 firebase 数据库检索到的数据,并做更多的事情,比如编辑、更新等。所以,我正在使用可观察模式来检索数据(成功地做到了)并尝试将数据传递给构造函数和适配器类。数据确实出现在构造函数类中,但没有加载到适配器类和 RecycleView 中。

fragment 类或主类

public class overviewFragment extends Fragment {

View view;
public static RecyclerView overRecycleView;
public overviewFragment() {}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.overview_fragment, container, false);
overRecycleView = view.findViewById(R.id.overViewRecycle);
overviewRecyclerAdapter adapter = new overviewRecyclerAdapter(getContext(), observerData.overViewlist);
overRecycleView.setLayoutManager(new LinearLayoutManager(getActivity()));
// adapter.notifyDataSetChanged();
overRecycleView.setAdapter(adapter);
return view;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

observableData ob =new observableData();
observerData observerData = new observerData(ob)
ob.setMeasurement();
ob.setMeasurement(); }}

用于检索 firebase 数据并通知观察者的可观察类

public class observableData extends Observable {
private String data;

public observableData() { }

public void setMeasurement(){
final DatabaseReference n = ScrollingActivityforTutor.db();

n.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String a = dataSnapshot.child("name").getValue().toString();
Log.d("name from database ", a);

data =a;

measurementChanged();

}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});

}

public void measurementChanged(){
setChanged();
notifyObservers();
}

public String getData() {
return data;
}
}

调用构造函数类的观察者类

public class observerData implements  Observer {
Observable observable;
public String data;
public static List<itemOverview> overViewlist = new ArrayList<>();;

public observerData(Observable observable) {
this.observable = observable;
observable.addObserver(this);
}

@Override
public void update(Observable o, Object arg) {
observableData od = (observableData) o;
this.data = od.getData();
passData();
}

public void passData(){
overViewlist.add(new itemOverview(data));
Log.d("data in observer ", data);
}
}

构造函数类

public class itemOverview {

private String text;

public itemOverview(String text) {
Log.d("IN CONSTRUCTOR ", text); // It is perfectly showing the data
this.text = text;
}

public String getText() {
return text;
}

public void setText(String text) {
this.text = text;
}}

适配器类

 public class overviewRecyclerAdapter extends 
RecyclerView.Adapter<overviewRecyclerAdapter.overviewViewHolder> {
Context mcontext;
List<itemOverview> mdata;

public overviewRecyclerAdapter(Context mcontext, List<itemOverview> mdata)
{
this.mcontext = mcontext;
this.mdata = mdata; }

public static class overviewViewHolder extends RecyclerView.ViewHolder{

private TextView t;

public overviewViewHolder(@NonNull View itemView) {
super(itemView);

t = itemView.findViewById(R.id.overViewtextView); }}

@NonNull
@Override
public overviewRecyclerAdapter.overviewViewHolder
onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v;
v = LayoutInflater.from(mcontext).inflate(R.layout.item_overview,
parent, false);
overviewViewHolder overview = new overviewViewHolder(v);
return overview; }

@Override
public void onBindViewHolder(@NonNull
overviewRecyclerAdapter.overviewViewHolder holder, int position) {

Log.d("IN ADAPTER ", mdata.get(position).getText()); // HERE, IT IS
NOT WORKING

holder.t.setText(mdata.get(position).getText());

}
@Override
public int getItemCount() {
return mdata.size() ;
}}

但是,当我在 onDatachange 方法之外使用 measurementChanged()(在可观察类中)并将数据(变量)放入某个字符串值时,一切正常,给定的数据显示在 recycleView 中。

不明白哪里出了问题,哪里调试。

但是,对于如此长的代码,我们深表歉意:)谢谢。

最佳答案

我看到您正在尝试以编程方式向 RecyclerView 添加元素。但是当您更新包含必要数据的数组时,RecyclerView 不会更新。由于您已将 RecyclerView 设为静态,因此您可以使用以下代码轻松地将更改通知适配器:

public void passData(){
overViewlist.add(new itemOverview(data));
Log.d("data in observer ", data);

overviewRecyclerAdapter adapter = (overviewRecyclerAdapter) overviewFragment.overRecycleView.getAdapter();
adapter.notifyDataSetChanged();
}

有很多更好的方法可以做到这一点。 adapter.notifyItemInserted(overViewlist.size()-1); 在您的情况下可能是更好的解决方案(就性能而言)。

附言您应该遵循 java 中的命名约定,以使您的代码更具可读性。

关于android - 从数据库中成功检索数据但无法通过适配器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54056433/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com