2017-06-01 80 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「 –

相關問題