Android中的TreeMap到ListView
Posted
技术标签:
【中文标题】Android中的TreeMap到ListView【英文标题】:TreeMap to ListView in Android 【发布时间】:2013-09-03 04:19:03 【问题描述】:我正在 android 中制作一个清单类型的应用程序,其中我在列表视图中填充项目,旁边有一个复选框。当用户单击一个项目时,我希望它删除文本并更新数据库中相关列的条目。出于这个原因,我将名称-值对存储在 TreeMap 中。其中 Name 对应于数据库列名,Value 对应于该列名中的值。我使用以下方法实现了这一点:
if ((c.getString(c.getColumnIndexOrThrow("Field130"))).length() > 3)
String D11 = c.getString(c.getColumnIndexOrThrow("Field130"));
map.put("Field130", D11);
现在我想在相应列表视图的一个文本视图中显示名称,并在第二个文本视图中显示值。我尝试了以下方法:
ArrayList<TreeMap<String, String>> mylist = new ArrayList<TreeMap<String, String>>();
mylist.add(map);
ListView list = (ListView) findViewById(R.id.list);
ArrayList<String> list1 = new ArrayList<String>(map.values());
dataAdapter = new ArrayAdapter<String>(this,R.layout.chklistlayout,R.id.textView1, list1);
list.setAdapter(dataAdapter);
但是我无法获得所需的结果,因为我只获得了显示的值。有没有办法可以将我的 TreeMap 直接映射到列表视图?我对更强大的想法持开放态度,即使这意味着重新编写我的整个代码。
【问题讨论】:
【参考方案1】:我终于做了一个自定义的Adapter,参考了这里:
1)What adapter shall I use to use HashMap in a ListView
2)http://www.vogella.com/articles/AndroidListView/article.html。
3)http://www.youtube.com/watch?v=wDBM6wVEO70
4) https://dl.google.com/googleio/2010/android-world-of-listview-android.pdf
编辑:根据 cmets 中的建议,我调用了 ViewHolder 模式来处理视图的回收并解决内存管理和电池使用问题。完整代码如下:
public class TreeMapAdapter extends ArrayAdapter<String>
private final Context context;
private final String[] values;
String[] mValues;
private TreeMap<String, String> mData = new TreeMap<String, String>();
private String[] mKeys;
public TreeMapAdapter(Context context, String[] mKeys,TreeMap<String, String> data)
super(context, R.layout.chklistlayout, mKeys);
this.context = context;
this.values = mKeys;
mData = data;
mValues = mData.values().toArray(new String[data.size()]);
public int getCount()
return mData.size();
public String getItem(int position)
return mData.get(mKeys[position]);
public long getItemId(int arg0)
return arg0;
@Override
public View getView(int position, View convertView, ViewGroup parent)
if (convertView == null)
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.chklistlayout,
parent, false);
holder = new ViewHolder();
holder.textView = (TextView) convertView.findViewById(R.id.textView1);
holder.imageview = (TextView) convertView.findViewById(R.id.textView2);
holder.CB = (CheckBox) convertView.findViewById(R.id.checkBox1);
convertView.setTag(holder);
else
holder = (ViewHolder) convertView.getTag();
holder.textView.setText(values[position]);
holder.imageview.setText(mValues[position]);
String s = mValues[position];
if (s.contains("h"))
holder.CB.setChecked(true);
else
return convertView;
以下是持有者类:
static class ViewHolder
TextView textView, imageview;
CheckBox CB;
回收视图有三种方式,一种称为 Dumb 方式,另一种称为正确方式,本例中使用的一种是最快的方式。以后偶然发现这篇文章的用户,我强烈建议您浏览 YouTube 视频。这很值得!
简而言之,ConvertView 负责视图的回收,它跟踪所有移出屏幕焦点的视图并返回一个被回收和重用的视图。
最后感谢 KMDev,他激发了研究更多并为 Holder 模式制作模板的想法。
【讨论】:
我建议你实现ViewHolder 模式。性能优势非常值得。 Android 团队在早期的 Google IO 的一次演讲中提到了这一点,但有很多博客文章都在重复同样的事情。 谢谢,我也在看。重新创建视图。但是我的列表最多只包含 130 项。所以我在考虑是否使用支架模式。 在性能方面需要考虑两件事:1. 滚动抖动 - 旧的、性能不佳的手机可能会在甩动时抖动 2. 电池。我们有义务尽可能地为性能编码。在你的情况下,这是否会产生微不足道的影响,我不知道。但是,如果你打算使用 ListViews,这是一个很好的习惯。只需使用视图持有者模式为 getView() 制作代码模板,您就不必再考虑它了。 :) 完成了,请检查一下:) 据我所知您必须使用key = getItem(position); value = mdata.get(key)
否则列表视图无法正常工作以上是关于Android中的TreeMap到ListView的主要内容,如果未能解决你的问题,请参考以下文章
Android - ListView 中的 EditTexts 绑定到自定义 ArrayAdapter - 跟踪更改