2017-06-01 47 views
0

我试图从我的Firebase数据库中获取充满信息的RecyclerView。在RecyclerView中显示Firebase数据库项目中的多个项目

我曾在数据库中只有一个项目(一个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:对于输入字符串: “咖啡”

这里是我的模型类以及

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); 
+0

'对于输入字符串:“咖啡”'...那么不要存储:'咖啡'在那个变量 –

+0

那么,你认为“咖啡”是一个有效的数字吗? –

回答

2

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); 
+0

感谢您的帮助,我甚至没有注意到我的副本。但现在我发现这个变化带来了新的错误。 “com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为com.jenovaprojects.beanscard.updated_ui.database类型。点“ –

+0

发布您的数据库结构到根目录和代码,你正在创建的Firebase'参考' –

+0

添加到问题 –

0

您使用此两次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(); 
} 
+0

谢谢你的帮助,我甚至没有注意到我的副本,但现在我得到一个新的错误,这个变化。“com.google .firebase.database.DatabaseException:无法将类型为java.lang.String的对象转换为类型com.jenovaprojects.beanscard.updated_ui.database.Points“ –

相关问题