【问题标题】:Displaying multiple items from a Firebase database item in RecyclerView在 RecyclerView 中显示 Firebase 数据库项目中的多个项目
【发布时间】:2017-06-02 18:42:38
【问题描述】:

我正在尝试从我的 firebase 数据库中获取一个充满信息的 RecyclerView。

我只使用了数据库中的 1 个项目(一个 int),但现在我也添加了一个字符串,它不会再工作了。

我的数据库结构是

-random key id
  - item: "Coffee"
  - points: 10 

这是我的适配器

public class RecyclerViewAdapter extends 
    RecyclerView.Adapter<RecyclerViewHolders> {
    private List<Points> task;
    protected Context context;
    public RecyclerViewAdapter(Context context, List<Points> task) {
        this.task = task;
        this.context = context;
    }
    @Override
    public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int 
    viewType) {
        RecyclerViewHolders viewHolder = null;
        View layoutView = 
    LayoutInflater.from(parent.getContext()).inflate(R.layout.to_do_list, 
    parent, false);
        viewHolder = new RecyclerViewHolders(layoutView, task);
        return viewHolder;
    }
    @Override
    public void onBindViewHolder(RecyclerViewHolders holder, int position) 
    {
        holder.categoryTitle.setText((task.get(position).getPoints()));
        holder.itemTitle.setText(task.get(position).getItem());
    }
    @Override
    public int getItemCount() {
        return this.task.size();
    }
}

这是我的 ViewHolder

public class RecyclerViewHolders extends RecyclerView.ViewHolder {
    private static final String TAG = 
    RecyclerViewHolders.class.getSimpleName();
    public ImageView markIcon;
    public TextView categoryTitle, itemTitle;
    public ImageView deleteIcon;
    private List<Points> taskObject;

    public RecyclerViewHolders(final View itemView, final List<Points> taskObject) {
        super(itemView);
        this.taskObject = taskObject;
        categoryTitle = (TextView) itemView.findViewById(R.id.task_title);
        itemTitle = (TextView) itemView.findViewById(R.id.itemTV);
    }
}

我的主要活动中的代码要显示到列表中

    allPoints = new ArrayList<Points>();
            recyclerView = (RecyclerView) 
    view.findViewById(R.id.point_list);
            linearLayoutManager = new LinearLayoutManager(getActivity());
            recyclerView.setLayoutManager(linearLayoutManager);

    private void getAllTask (DataSnapshot dataSnapshot) {
        for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
            String taskTitle = singleSnapshot.getValue(String.class);
            String taskItem = singleSnapshot.getValue(String.class);
            allPoints.add(new Points(taskItem, 
    Integer.parseInt(taskTitle)));
            recyclerViewAdapter = new RecyclerViewAdapter(getActivity(), 
    allPoints);
            recyclerView.setAdapter(recyclerViewAdapter);
        }
    }

当我只显示“点”时它可以工作,但现在我添加了字符串“项目”,它会在该字符串上抛出一个 NumberFormatExepton。

java.lang.NumberFormatException:对于输入字符串:“Coffee”

这也是我的模型类

public class Points {

    public int points;
    public String item;

    public Points(){}

    public Points(String item, int points) {
        this.points = points;
        this.item = item;
    }

    public int getPoints(){
        return points;
    }

    public void setPoints(int points){
        this.points = points;
    }

    public String getItem(){
        return item;
    }

    public void setItem(String item){
        this.item = item;
    }

}

这是我的结构

beans-card
 user
 urx53ou8uBhRODfyqqf57kb8Z0S2
 -KlYnqRvumMfu5h0FvLp
 item: 
   "Coffee"
 points: 
   10

还有我的参考

 DatabaseReference db_receipt = 
 FirebaseDatabase.getInstance().getReference().child("user").child(mUserId);

【问题讨论】:

  • For input string: "Coffee"... 然后不要在那个变量中存储:Coffee
  • 那么,你认为“Coffee”是一个有效的数字吗?

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


【解决方案1】:

1.) 使用Points 类而不是String

2.) 不要在每次循环迭代中重新创建适配器

    for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
        Points point = singleSnapshot.getValue(Points.class);
        allPoints.add(point);
    }

// move adapter statements outside loop
recyclerViewAdapter = new RecyclerViewAdapter(getActivity(),allPoints);
recyclerView.setAdapter(recyclerViewAdapter);

【讨论】:

  • 感谢您的帮助,我什至没有注意到我的重复。但现在我得到了这个更改的新错误。 “com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.jenovaprojects.beanscard.updated_ui.database.Points 类型”
  • 将您的数据库结构发布到您正在创建 Firebase 的根目录和代码 reference
  • 将两者都添加到问题中
  • 试试你的参考FirebaseDatabase.getInstance().getReference().child("user");
【解决方案2】:

您使用了两次singleSnapshot.getValue(String.class);,因此您获得了两次相同的数据。

您可以直接映射到您的对象。

Points point = singleSnapshot.getValue(Points.class);

然后,您无需在每个循环中创建一个新适配器。你只需要这个一次。

recyclerView.setLayoutManager(linearLayoutManager);

// Move this under above line
recyclerViewAdapter = new RecyclerViewAdapter(getActivity(), allPoints);
recyclerView.setAdapter(recyclerViewAdapter);

您可能想在循环之前清除列表。

private void getAllTask (DataSnapshot dataSnapshot) {
    allPoints.clear(); // Remove the old data
    for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
        allpoints.add(singleSnapshot.getValue(Points.class));
    }

    // Then, you notify the adapter, not create a new one
    recyclerViewAdapter.notifyDataSetChanged();
}

【讨论】:

  • 感谢您的帮助,我什至没有注意到我的重复。但现在我得到了这个更改的新错误。 “com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.jenovaprojects.beanscard.updated_ui.database.Points 类型”
猜你喜欢
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多