我正在Android中制作一个清单类型的应用程序,我在其中填充列表视图中的项目,旁边有一个复选框。当用户点击某个项目时,我希望它删除文本并更新数据库中相关列的条目。出于这个原因,我将名称 - 值对存储在TreeMap中。其中Name对应于Database Column Name,Value对应于该Column name中的值。我使用以下方法实现了这一目标:
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直接映射到列表视图吗?我对那些更强大的想法持开放态度,即使这意味着重新编写我的整个代码。
答案 0 :(得分:4)
我终于制作了一个自定义适配器,从这里参考:
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
编辑:根据评论中的建议,我调用了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模式制作模板的想法。