0

我正在 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 直接映射到列表视图?我对更强大的想法持开放态度,即使这意味着重新编写我的整个代码。

4

1 回答 1

4

我终于做了一个自定义适配器,从这里参考:

1)我应该使用什么适配器在 ListView 中使用 HashMap

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 模式制作模板的想法。

于 2013-08-31T08:09:59.653 回答