我想使用HashMap
获取Adapter
的项目列表,以便ListView
。我打算使用ArrayAdapter<>
,但我不能,因为它只与List<>
一起工作。我应该使用什么适配器?我应该在ListView中使用什么适配器来使用HashMap
回答
你可以得到你的地图项的数组:
Entry<MyKey, MyValue>[] entries =
map.entrySet().toArray(new Entry<MyKey, MyValue>[0]);
话虽这么说,如果你在更新地图或使用地图功能的适配器,然后进行自定义适配器规划并不困难,并会更有意义。
您可以通过子类BaseAdapter开始,它提供了所有需要运行的几个Adapter方法的实现。
没有预定义的适配器将呈现HashMap。我建议通过扩展BaseAdapter来创建自己的适配器。
编辑:这是更多钞票与使用HashMap和扩大BaseAdapter,这里是一个(未经测试)例如:
public class HashMapAdapter extends BaseAdapter {
private HashMap<String, String> mData = new HashMap<String, String>();
private String[] mKeys;
public HashMapAdapter(HashMap<String, String> data){
mData = data;
mKeys = mData.keySet().toArray(new String[data.size()]);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(mKeys[position]);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
String key = mKeys[pos];
String Value = getItem(pos).toString();
//do your view stuff here
return convertView;
}
}
这具有以下警告,该项目的顺序是不能保证是相同的为了添加它们。写这个例子让我意识到了;不要在一个适配器使用HashMap的:)
您无法使用HashMap是您的扩展BaseAdapter类,因为BaseAdapter实现了ListAdapter。 – Eugene 2011-03-08 19:40:33
上面添加的例子 – longhairedsi 2011-03-08 23:04:52
如果有人仍在寻找解决方案,我建议检查我对类似问题的答案:http:// stackoverflow。com/a/19467717/1891118 – 2014-02-21 15:15:49
感谢您的回答longhairedsi
这具有以下警告,该项目的顺序是不能保证你加入他们的顺序相同。写这个例子让我意识到了;不要在适配器中使用HashMap :)
要解决此问题,请改为使用LinkedHashMap。
public class HashMapAdapter extends BaseAdapter {
private LinkedHashMap<String, String> mData = new LinkedHashMap<String, String>();
private String[] mKeys;
public HashMapAdapter(LinkedHashMap<String, String> data){
mData = data;
mKeys = mData.keySet().toArray(new String[data.size()]);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(mKeys[position]);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
String key = mKeys[pos];
String Value = getItem(pos).toString();
//do your view stuff here
return convertView;
}
}
在适配器文件
MyAdapter.java
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Map;
public class MyAdapter extends BaseAdapter {
private final ArrayList mData;
public MyAdapter(Map<String, String> map) {
mData = new ArrayList();
mData.addAll(map.entrySet());
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Map.Entry<String, String> getItem(int position) {
return (Map.Entry) mData.get(position);
}
@Override
public long getItemId(int position) {
// TODO implement you own logic with ID
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final View result;
if (convertView == null) {
result = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_adapter_item, parent, false);
} else {
result = convertView;
}
Map.Entry<String, String> item = getItem(position);
// TODO replace findViewById by ViewHolder
((TextView) result.findViewById(R.id.text1)).setText(item.getKey());
((TextView) result.findViewById(R.id.text2)).setText(item.getValue());
return result;
}
}
调用此适配器
public void showCinemas(HashMap<String, String> cinemas) {
MyAdapter adapter = new MyAdapter(cinemas);
list.setAdapter(adapter);
}
词典中维持秩序,如果密钥类型适用,你总是可以将它们添加到它们自己的ArrayList中,进行排序它使用Collections.sort,并将其作为参考点。
private ArrayList<String> mKeys = new ArrayList<>();
for (String aKey :data.keySet()){
mKeys.add(aKey);
}
Collections.sort(mKeys);
你能做什么,恕我直言,是生成您尝试添加HashMap中的他们键值一个新的列表,然后将该列表传递到自定义适配器。然后将HashMap集合导入到适配器中,并使用参考键列表中的HashMap.get(key);
。
- 1. 我应该使用什么键为HashMap?
- 2. 我应该使用表适配器吗?
- 3. 我应该使用同步适配器
- 4. 使用适配器的listview
- 5. 我应该使用哪个适用于Ruby的CouchDB适配器?
- 6. android-在使用Base适配器的Fragment中实现ListVIew,我做错了什么?
- 7. 我应该使用什么控制器?
- 8. 带有HashMap的ListView适配器
- 9. 在我的项目中使用ListView的适配器
- 10. 我们应该在生产中使用什么AWS配置?
- 11. 我应该在Xcode中使用什么工具来查看FPS?
- 12. 在Twisted中使用MongoDB。为什么我不应该使用pymongo?
- 13. 为什么我应该使用额外的布局文件来呈现ListView?
- 14. 为什么我应该在python中使用@property装饰器?
- 15. 何时应该在ActiveMQ中使用JDBC持久性适配器?
- 16. 我应该重新使用表适配器实例吗?
- 17. 为什么来自适配器getView(..)方法的条件不适用于ListView
- 18. 为什么我应该在Silverlight应用程序中使用MVVM?
- 19. 我应该在Mac和Windows上使用什么来编码C++?
- 20. 我应该使用什么样的应用程序服务器?
- 21. 在Java中我使用“导入”,在C#中我使用“使用”,在VB6中我应该使用什么?
- 22. 我应该在Hudson中使用什么样的配置文件来构建我的iOS应用程序?
- 23. 我应该用什么来比较DBNull?使用DBNull.Value或ToString()。IsNullOrEmpty()
- 24. 我应该使用什么工具来构建我的网站?
- 25. 我应该使用什么方法来制作我的Java GUI?
- 26. 我应该使用什么URL来创建我的simpleDB域?
- 27. 使用适配器来显示ListView单声道为Android
- 28. 我应该使用什么? AJAX或jQuery?
- 29. 我应该使用什么jetty jar?
- 30. 我应该使用什么积压值?
你如何处理'不能创建一个通用数组 Map.Entry'异常? –
2012-02-02 09:23:19