使用RecyclerView和HashMap根据位置获取键和值

时间:2018-12-29 12:18:45

标签: android android-recyclerview

我具有当前的onBindViewHolder函数:

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    myHolder = holder;    
    //Here I need to set text ("Hello" and "World") to myHolder.itemTextView.setText(text);
}

假设我的数据集是一个名为myDataset的HashMap:如果我有position,如何获取键和值?

这是我首先在活动中设置数据的方式:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
myDataset = new HashMap<>();

myDataset.put("key1", "Hello");
myDataset.put("key2", "World");


mAdapter = new HashMapAdapter(myDataset);
mRecyclerView.setAdapter(mAdapter);

或者,如果我使用的是HashMap,应该采用不基于位置的其他方式吗?

2 个答案:

答案 0 :(得分:1)

如果使用地图作为数据源,将很困难。我建议先从map转换为arraylist,然后将其安装在适配器上。为什么?因为它的 POSITION 完全不能保证准确。 ,但如果您一直想使用地图,可能会像这样:

@Override
        public void onBindViewHolder(MyViewHolder holder, int position) {

            int i = 0;
            for (Map.Entry<String, String> entry : myDataset.entrySet()) {
                if(position == i){
                    String key = entry.getKey();
                    String value = entry.getValue();

                    // print your hello word here
                    break;
                }
                i++;
            }
        }

我再说一次,不要使用地图,而要使用列表,以便获得的数据顺序正确

答案 1 :(得分:0)

您可以像这样将HashMap转换为Iterator对象:

Iterator it = myDataset.entrySet().iterator();

然后迭代抛出您的迭代器值以得到您的位置,如下所示:

    int p = 0;
    while (it.hasNext()) {
        if (p == position) {
            Map.Entry pair = (Map.Entry) it.next();
            System.out.println(pair.getKey() + " = " + pair.getValue());
            break;
        }

        p++;
    }