android - 数据成功从数据库中检索,但无法通过适配器类
问题描述
嗯......我想在 RecycleView 中显示从 firebase 数据库检索到的数据,并做进一步的事情,如编辑、更新等。所以,我使用可观察模式来检索数据(成功完成)并尝试将数据传递给构造函数和适配器类。数据确实显示在构造函数类中,但没有加载到适配器类和 RecycleView 中。
片段类或主类
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 数据并通知观察者的 Observable 类
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);
在您的情况下可能是一个更好的解决方案(就性能而言)。
PS 您应该遵循 java 中的命名约定,以使您的代码更具可读性。
推荐阅读
- android - 如何防止 Android ViewPager2 自动滚动到带有 VideoView 的页面?
- android - 如何在 nativescript 应用程序中捕获 android dispatchKeyEvent?
- python-3.x - 如何在python所有脚本上循环?
- c# - ComboBox.SelectedValue 在表单的构造函数中为 null
- r - 使用 dplyr 删除至少一个 NA 的所有行的 R 函数不起作用
- python - 在 While 循环中创建停止 - Python
- pytorch - 如何从 pytorch 模块获取子模块序列?
- karate - 空手道 - 访问请求的变量就像响应一样
- ios - Flutter iOS 应用程序被拒绝,因为“NSLocationAlwaysUsageDescription”没有目的字符串,但该应用程序不使用位置服务
- html - 使用引导程序创建水平导航栏