【问题标题】:Hashmap is not attached to AdapterHashmap 未附加到适配器
【发布时间】:2019-01-13 08:58:29
【问题描述】:

我正在尝试将map 加载到RecyclerAdapter 以使用这些值填充recyclerView,但在valueEventlistener 中,这些值正在加载到地图中,但adapter 没有收到这些更改的通知。我尝试检查map 的大小,它显示的值正确,但是当我检查adapter 内的getitemcount() 时,它为零。

private Map<String, OrderItem>    convoModels = new HashMap<>();
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_order_conversation);
    inearLayoutManager mLayoutManager2
            = new LinearLayoutManager(OrderConversation.this, 
    LinearLayoutManager.VERTICAL, false);
    mCartList = (RecyclerView) findViewById(R.id.conversationlist);
    mCartList.setLayoutManager(mLayoutManager2); 
    mAdapterConvo  = new ConvoFirstAdapter(convoModels);
    mCartList.setAdapter(mAdapterConvo);
    loaddData();
  }

loadData方法中

mDatabase.addValueEventListener(new ValueEventListener() {
             @Override
             public void onDataChange(DataSnapshot dataSnapshot) {
                 for(DataSnapshot ds: dataSnapshot.getChildren()){
                     GenericTypeIndicator<Map<String, OrderItem>> to = 
                     new GenericTypeIndicator<Map<String, OrderItem>>() 
                      {};
                     Map<String, OrderItem> map = ds.getValue(to);
                     convoModels =  ds.getValue(to);
                     mAdapterConvo.notifyDataSetChanged();
                     int i =   mAdapterConvo.getItemCount();
                     Toast.makeText(OrderConversation.this, "size of map is "+ 
                     convoModels.size() + "size of adap "+ i, 
                     Toast.LENGTH_SHORT).show();

                     for(OrderItem ml:convoModels.values()) {
                         String name = ml.getName();
                         Toast.makeText(OrderConversation.this, "name is "+ 
                         name, Toast.LENGTH_SHORT).show();
                     }
                   }
              }
             @Override
             public void onCancelled(DatabaseError databaseError) {
             }
         });

Adapter 类是

public class ConvoFirstAdapter extends 
RecyclerView.Adapter<OrderConversation.ConvoViewHolder> {
    private Map<String, OrderItem> userModels;
    private Context context;

public ConvoFirstAdapter() {
    this.userModels = new HashMap<>();
}
public ConvoFirstAdapter(Map<String, OrderItem> mMessageList) {
    this.userModels = mMessageList;
}

@Override
public OrderConversation.ConvoViewHolder onCreateViewHolder(ViewGroup 
parent, int viewType) {
    context = parent.getContext();
    return new 
    OrderConversation.ConvoViewHolder
             (LayoutInflater.from(parent.getContext())
            .inflate(R.layout.convo_layout, parent, false));

}

@Override
public void onBindViewHolder(OrderConversation.ConvoViewHolder holder, 
int position) {
    CustomLinearLayoutManager c = new 
    CustomLinearLayoutManager(context);
    holder.init();
    holder.setLayoutManager(c);
    holder.setConvoAdapter(userModels,context);
}

@Override
public int getItemCount() {

    return userModels.size();
}

}

我的数据库的结构如下所示,我正在调用订单-userid-cusomerId 节点

【问题讨论】:

  • bcz convoModels 没有价值
  • 请在初始化适配器之前在 convoModels 中添加一些项目
  • 我想你错过了这一行 Toast.makeText(OrderConversation.this, "name is "+ convoModels.size() + "size of adap "+ i, Toast.LENGTH_SHORT).show(); convomodels 的大小为 2 并不意味着其中有一些项目。
  • 哦,对不起,我错过了
  • 先初始化数据再初始化适配器

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


【解决方案1】:
private Map<String, OrderItem>    convoModels = new HashMap<>();
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_order_conversation);
    inearLayoutManager mLayoutManager2
            = new LinearLayoutManager(OrderConversation.this, 
    LinearLayoutManager.VERTICAL, false);
    mCartList = (RecyclerView) findViewById(R.id.conversationlist);
    mCartList.setLayoutManager(mLayoutManager2); 
Log.e(getClass().getSimpleName(),"Initi.... Adapter");
    mAdapterConvo  = new ConvoFirstAdapter(convoModels);
    mCartList.setAdapter(mAdapterConvo);
    loaddData();
  }

加载数据();

mDatabase.addValueEventListener(new ValueEventListener() {
         @Override
         public void onDataChange(DataSnapshot dataSnapshot) {
             for(DataSnapshot ds: dataSnapshot.getChildren()){
                 GenericTypeIndicator<Map<String, OrderItem>> to = 
                 new GenericTypeIndicator<Map<String, OrderItem>>() 
                  {};
                 Map<String, OrderItem> map = ds.getValue(to);
                 convoModels =  ds.getValue(to);
                 mAdapterConvo.notifyDataSetChanged();
                 int i =   mAdapterConvo.getItemCount();
                 /* Toast.makeText(OrderConversation.this, "size of map is "+ 
                 convoModels.size() + "size of adap "+ i, 
                 Toast.LENGTH_SHORT).show(); */
Log.e("AddValueEent","size of map is: "+convoModels.size()+" size of Adap : "+i);

                 for(OrderItem ml:convoModels.values()) {
                     String name = ml.getName();
                     /*Toast.makeText(OrderConversation.this, "name is "+ 
                     name, Toast.LENGTH_SHORT).show();*/
Log.e("inLoop","Name is : "+name);
                 }
               }
          }
         @Override
         public void onCancelled(DatabaseError databaseError) {
Log.e("inCancelled","Yes");
         }
     });

【讨论】:

  • 结果还是一样
  • 在初始化适配器之前检查hasmap是否有值
  • 还有其他方法可以在适配器中使用 Hashmap,我认为它没有连接到适配器,这就是它返回 null 的原因。
  • mAdapterConvo = new ConvoFirstAdapter(convoModels,getApplicationContext());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2021-02-26
  • 2020-04-06
相关资源
最近更新 更多