【问题标题】:Android Recycler View with Firebase使用 Firebase 的 Android 回收站视图
【发布时间】:2017-08-23 13:29:46
【问题描述】:

我正在尝试在片段中使用回收器视图,并正在使用 firebase 从数据库中获取数据。问题是当我设置适配器时,没有调用我的回收器视图方法,例如 onCreateViewHolder、onBindViewHolder、getItemCount。我可以通过在调试器模式下运行应用程序来确认这一点。 我的片段:

public class Ongoing 扩展 Fragment {

RecyclerView recyclerView;
ProjectAdapter adapter;
ArrayList<ProjectModel> project ;

String[] project_name = new String[3];
String[] project_desc = new String[3];

    @Nullable
    @Override
    public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.project_layout, container, false);
        recyclerView = (RecyclerView) v.findViewById(R.id.rv_projects);
        project = new ArrayList<>();
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference ref = database.getReference("projects");

        ref.child("ongoing").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                int i = 0;
                for(DataSnapshot dsp: dataSnapshot.getChildren()){
                    //System.out.println(dsp.child("name").getValue());
                    //System.out.println(dsp.child("description").getValue());
                    //ProjectModel p = new ProjectModel(dsp.child("name").getValue().toString(),dsp.child("description").getValue().toString());
                    //project.add(i,p);
                    project_name[i]= dsp.child("name").getValue().toString();
                    project_desc[i]= dsp.child("description").getValue().toString();
                    i++;
                }
                System.out.println(project_name);
                System.out.println(project_desc);

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        adapter = new ProjectAdapter(project_name, project_desc,getActivity());
        recyclerView.setAdapter(adapter);
        LinearLayoutManager llm = new LinearLayoutManager(getActivity(),LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(llm);
        return v;

    }

}

我的 RecyclerView 适配器:

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.adg.adgofficial.R;

public class ProjectAdapter extends RecyclerView.Adapter<ProjectAdapter.ProjectViewHolder>{

    String[] project_name,project_desc;
    //ArrayList<ProjectModel> project;
    Context context;

    public ProjectAdapter( String[] project_name,String[] project_desc ,Context context) {

        this.project_name = project_name;
        this.project_desc = project_desc;
        this.context = context;
    }

    @Override
    public ProjectViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.projects_element,parent,false);
        return new ProjectViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ProjectViewHolder holder, int position) {
        holder.title.setText(project_name[position]);
        holder.desc.setText(project_desc[position]);
    }


    @Override
    public int getItemCount() {
        return 3;
    }

    public static class ProjectViewHolder extends RecyclerView.ViewHolder {

        TextView title, desc;

        public ProjectViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.proj_element_title);
            desc = (TextView) itemView.findViewById(R.id.proj_element_desc);
        }
    }
}

这个问题困扰了我好几个星期,我似乎找不到解决办法。在此先感谢您的帮助。

【问题讨论】:

  • 尝试在 onDataChange() 中的 for 循环之后添加 adapter.notifyDataSetChanged();
  • koceeng 我试过这样做,但仍然没有帮助。 Recycler 视图仍然是空的。
  • System.out.println(project_name); 是否显示任何值?
  • 是的,它给出了接收到的数据的字符串值。

标签: android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

试试这个:

 ArrayList<String> project_name = new ArrayList<>();
    ArrayList<String>  project_desc = new ArrayList<>();


             ref.child("ongoing").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {


                        for(DataSnapshot dsp: dataSnapshot.getChildren()){

   ProjectModel p = dsp.getValue(ProjectModel.class);  
                            project_name.add(p.getproject_name);   
                            project_desc.add(p.getproject_desc);

                        }
                        System.out.println(project_name);
                        System.out.println(project_desc);
         adapter = new ProjectAdapter(project_name, project_desc,getActivity());
                recyclerView.setAdapter(adapter);
        adapter.notifyDataSetChanged();

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

【讨论】:

  • @Kronos 做了 System.out.println(project_name);显示任何价值?
  • 是的,它给出了接收数据的字符串值。
  • 我尝试了您建议的答案,但它不起作用。它仍然给出一个空白片段。这是我在 for 循环数据快照中更改的内容: ProjectModel p = new ProjectModel(dsp.child("name").getValue().toString(),dsp.child("description").getValue().toString() );项目.add(i,p);
  • @Kronos 您没有使用火基 java 对象类吗?它具有 getter/setter 属性。
  • 不,我使用的是我自己的自定义 java 模型类,它有自己的 getter 和 setter。