Android 如何为ArrayList充气<;HashMap<;整数,对象>&燃气轮机;回收视图的值
我的查询是,我的值存储在HashMap中,HashMap存储在ArrayList中。我可以充气,但它只得到充气的最后一个增值 根据用户位置,共有7个项目,不同位置的项目可能有所不同。这七项是(A、B、C、D、E、F、G) 我正在测试它是否打印了所有的七个项目。但它只打印“G”,因为它在HashMap的末尾添加了“G”。但是,所有值都存储在Arraylist中 以下是onBindViewHolder和getItemCount的代码IAndroid 如何为ArrayList充气<;HashMap<;整数,对象>&燃气轮机;回收视图的值,android,arraylist,android-recyclerview,static,hashmap,Android,Arraylist,Android Recyclerview,Static,Hashmap,我的查询是,我的值存储在HashMap中,HashMap存储在ArrayList中。我可以充气,但它只得到充气的最后一个增值 根据用户位置,共有7个项目,不同位置的项目可能有所不同。这七项是(A、B、C、D、E、F、G) 我正在测试它是否打印了所有的七个项目。但它只打印“G”,因为它在HashMap的末尾添加了“G”。但是,所有值都存储在Arraylist中 以下是onBindViewHolder和getItemCount的代码I @Override public void onBindVie
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
ProductList data;
int n=0;
for (HashMap<Integer, Object> mapEntry: itemDataList){
//mapEntery shows size: 3 and
//itemDataList shows size: 7 IDK Why there is a mismatch also.
//Size of itemDataList is accurate which is why its prints 7 times
data = (ProductList) mapEntry.get(n)
System.out.println(data);
holder.recyclerViewItemNameAdapter.setText(data.getITEM_NAME());
n++;
}
}
@Override
public int getItemCount() {
return itemDataList.size();
}
@覆盖
public void onBindViewHolder(@NonNull ViewHolder,int位置){
产品列表数据;
int n=0;
for(HashMap映射条目:itemDataList){
//Mapentry显示大小:3和
//itemDataList显示大小:7 IDK为什么也存在不匹配。
//itemDataList的大小是准确的,这就是它打印7次的原因
数据=(ProductList)mapEntry.get(n)
系统输出打印项次(数据);
holder.RecycleServiceItemNameAdapter.setText(data.getITEM_NAME());
n++;
}
}
@凌驾
public int getItemCount(){
返回itemDataList.size();
}
我的主要活动:
ValueEventListener eventListener= new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
int n=0;
for (DataSnapshot ds: dataSnapshot.getChildren()){
for (int i=0; i<LocateUID.size();i++){
String uid= LpcateUID.get(i);
String dsUID= ds.getKey();
final HashMap<Integer, Object> id = new HashMap<>();
if(dsUID.equals(uid)){
for (DataSnapshot d: ds.getChildren()){
productList.setITEM_NAME(d.child("item_NAME").getValue(String.class));
id.put(n,productList);
arrayListProduct.add(id);
n++;
}
}
}
}
}
RecyclerItemList();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
ValueEventListener eventListener=新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
if(dataSnapshot.exists()){
int n=0;
对于(DataSnapshot ds:DataSnapshot.getChildren()){
对于(int i=0;i,每次渲染项目时,您都会迭代整个列表。我不建议这样做,因为这是一个耗时的过程。您的方法总是以最后一个项目为结果。请尝试下面的方法
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
ProductList data = itemDataList.get(position);
System.out.println(data);
holder.recyclerViewItemNameAdapter.setText(data.getITEM_NAME());
}
我想说,您可以在onDataChange
上进行更多优化。谢谢@learner,您在解决这个问题上帮了我很多。我终于能够通过使用对象数组来解决它,但是,我的代码还有一个问题,即变量是静态的,最终用最后一个变量替换了所有变量在ArrayList中更新,我甚至没有想到。它在这里:
for (DataSnapshot d: ds.getChildren()){
productList.setITEM_NAME(d.child("item_NAME").getValue(String.class));
id.put(n,productList);
// Here this variable "n" was static
//because of that all the values were replace
arrayListProduct.add(id);
n++;
我做了一些更改,因为我在ArrayList中使用了Array的对象。通过它,我终于能够解决问题。编码愉快!!我的意思是我只得到了“G”值打印了7次。我已经尝试了您的代码,但是我在ArrayList itemDataList
中存储的值与我使用int
作为值作为键和ProductList
作为对象时的值有点不同,其中int
值随着ProductList
对象的存储而递增。因此,t不同的对象的int
值是不同的。因此,当我使用你的code
时,我会得到空值。我知道在存储值并检查后,我发现所有的值都是相同的。我使用的int
似乎是静态的,最终取代了所有的e值与映射中最后更新的值。我必须尝试不同的方法将值存储在映射中。您能建议一种不同的方法吗,因为我的代码中的错误是由于静态值。并且我无法找到HashMap的as链接或相关信息。由于n++每次迭代都会递增,因此不可能重写,但每个项都可能有除了Map中的值之外,我建议不要嵌套集合,如果嵌套,则需要在适配器中进行迭代。我建议您根据需要组织数据和处理逻辑,并将其作为Arraylist发送到适配器