【问题标题】:Data from Firebase not displayed on RecyclerView来自 Firebase 的数据未显示在 RecyclerView 上
【发布时间】:2016-06-02 09:31:08
【问题描述】:

我正在尝试从我的 Firebase 数据库中显示数据,但我得到以下信息: my recyclerview

Firebase database.

我一直在寻找不同的解决方案,但我仍然不断地回到同一个问题。我对 Android 和一般编程相当陌生,所以任何帮助将不胜感激。这是相关的代码。

日志片段:

public class LogbookFragment extends Fragment {

private TextView textView;
private CardView cardView;
private String assessment;
private String details;

private RecyclerView rv;
RequestQueue requestQueue;

private List<Assessment> skillsList = new ArrayList<>();

private static final String ARG_SECTION_NUMBER = "position";

/**
 * Returns a new instance of this fragment for the given section
 * number.
 */
public static LogbookFragment newInstance(int position) {
    LogbookFragment fragment = new LogbookFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_SECTION_NUMBER, position);
    fragment.setArguments(args);
    return fragment;
}

public LogbookFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_logbook, container, false);

    Context context = getActivity();
    cardView = (CardView) rootView.findViewById(R.id.cv);
    rv = (RecyclerView) rootView.findViewById(R.id.rv);

    final LinearLayoutManager llm = new LinearLayoutManager(context);
    rv.setLayoutManager(llm);

    final RVAdapter adapter = new RVAdapter(skillsList);
    rv.setAdapter(adapter);

    initializeData();

    return rootView;
}

private void initializeData(){
    skillsList = new ArrayList<>();
    Firebase ref = new Firebase("https://athenajs.firebaseio.com/assessments");

    final RVAdapter adapter = new RVAdapter(skillsList);


    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            System.out.println(dataSnapshot.getValue());

            for(DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                for (int i = 0; i<42; i++) {
                    assessment = postSnapshot.child("assessment").getChildren().toString();
                    details = postSnapshot.child("details").getChildren().toString();

                    skillsList.add(new Assessment(assessment, details));
                    rv.setAdapter(adapter);
                    adapter.notifyDataSetChanged();
                }

            }

        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            System.out.println("The read failed: " + firebaseError.getMessage());
        }
    });
}

}

RV适配器:

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.AssessViewHolder> {



public static class AssessViewHolder extends RecyclerView.ViewHolder {

    CardView cv;
    TextView assessName;
    TextView pracName;

    AssessViewHolder(View itemView) {
        super(itemView);
        cv = (CardView)itemView.findViewById(R.id.cv);
        assessName = (TextView)itemView.findViewById(R.id.assessment);
        pracName = (TextView) itemView.findViewById(R.id.details);

    }
}

List<Assessment> skill;

RVAdapter(List<Assessment> skills){
    this.skill = skills;
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

@Override
public AssessViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.itemlogbook, viewGroup, false);
    AssessViewHolder avh = new AssessViewHolder(v);
    return avh;
}

@Override
public void onBindViewHolder(AssessViewHolder assessViewHolder, int i) {
    assessViewHolder.assessName.setText(skill.get(i).assessment);
    assessViewHolder.pracName.setText(skill.get(i).details);
}

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

}

}

评估类:

public class Assessment {
String assessment;
String details;

Assessment(String assessment, String details) {
    this.assessment = assessment;
    this.details = details;

}

public String getAssessment() {
    return assessment;
}

public String getDetails() {
    return details;
}

【问题讨论】:

  • 问题可能是您只在初始化适配器之后才将数据添加到skillsList - 并且由于skillsList 一开始是空的,所以没有什么可显示的。这也意味着行skillsList.add(new Assessment(assessment, details)); rv.setAdapter(adapter); adapter.notifyDataSetChanged(); 无效。您应该在适配器中添加一个接受skillsList 的方法,然后更新基础数据。调用该方法后,您可以调用adapter.notifyDataSetChanged();

标签: android firebase android-recyclerview


【解决方案1】:

正如 cmets 中所述,问题可能是您仅将数据添加到 skillsList AFTER 您已经初始化了您的适配器 - 并且因为 skillsList 一开始是空的,没有什么可显示的。 因此,由于您实际上并未更改基础数据,而是使用第一个初始数据初始化适配器 - 这些是您应该对 initializeData() 方法进行的更改:

private void initializeData(){
    skillsList = new ArrayList<>();
    Firebase ref = new Firebase("https://athenajs.firebaseio.com/assessments/skills");

    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            System.out.println(dataSnapshot.getValue());

            for(DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                for (int i = 0; i<42; i++) {
                    assessment = postSnapshot.child("assessment").getValue().toString();
                    details = postSnapshot.child("details").getValue().toString();
                    //here you add the assessment object to the list
                    skillsList.add(new Assessment(assessment, details));                    
                }

            }
            //at this point you have looped through all the "children" - 
            //now you are ready to initialize the adapter
            RVAdapter adapter = new RVAdapter(skillsList);
            rv.setAdapter(adapter));
            //commented out: no need to call this now - since you have not made any changes to the data
            //adapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            System.out.println("The read failed: " + firebaseError.getMessage());
        }
    });
}

我希望这会有所帮助。试试看,然后告诉我。

【讨论】:

  • 您好,感谢您的回答。我在 recyclerview 中显示数据,但它们不是字符串。我收到以下信息:i.stack.imgur.com/YbZT3.jpg您认为可以为此做些什么吗?
  • 嗨,这是一个很好的进展,至少你的 List 正在显示 - 我认为你的行 postSnapshot.child("details").getChildren().. 可能有问题,根据你的数据结构 - 你有 @987654328 的值吗@ 或者你在"details" 下还有更多的孩子吗?如果没有,那么你可以简单地获取detailsassessment 的值。我已经更新了我的答案 - 请尝试一下。
  • 好吧,我尝试从 .getChildren() 更改为 .getValue() 但应用程序现在在加载数据时崩溃。我现在收到此错误:java.lang.NullPointerException:尝试在 athena.sentineljs.com.athena.LogbookFragment$1 的空对象引用上调用虚拟方法“java.lang.String java.lang.Object.toString()”。 onDataChange(LogbookFragment.java:85)
  • 您能否给我看一下您在 Firebase 上的数据的屏幕截图?这将帮助我理解代码应该如何查找值。
  • 我已经用我的 Firebase 数据库的屏幕截图编辑了答案。你也可以在这里找到它:i.stack.imgur.com/gWPNX.png
【解决方案2】:

我认为这里的这两行是导致问题的原因

 assessment = postSnapshot.child("assessment").getChildren().toString();
 details = postSnapshot.child("details").getChildren().toString();

根据 firebase 文档,您应该通过调用

来检索您的价值
getValue() 

方法不

toString();

由于我不知道您的评估和详细信息数据如何。如果是单个值那么

assessment = postSnapshot.child("assessment").getValue(String.class);
     details = postSnapshot.child("details")..getValue(String.class);

会成功的。

欲了解更多信息,请转到here

【讨论】:

  • 您好,谢谢您的回答!我已经尝试过并阅读了文档,但现在我的回收站视图中没有任何内容。对此有什么想法吗?
  • 能否请您张贴您的athenajs.firebaseio.com/assessments 的屏幕截图,以便我查看数据架构
  • 我刚刚用截图编辑了答案。你也可以在这里找到它:i.stack.imgur.com/gWPNX.png
  • 我刚刚试了一下。恐怕我的recyclerview里还是没有数据。
  • 嘿,我刚刚设法根据上述答案中的 cmets 正确显示数据。非常感谢您的帮助和努力,但非常感谢。 :)
猜你喜欢
  • 2018-08-30
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
相关资源
最近更新 更多