关闭

adapter.notifyDataSetChanged()不起作用

504人阅读 评论(0) 收藏 举报
分类:
</pre><pre name="code" class="java">ArrayAdapter<String> adapter;
private List<String> list = new ArrayList<String>();
// ......
        list.add("1");
        list.add("1");
        list.add("1");
        list.add("1");
        list.add("1");
        list.add("1");
        adapter = new ArrayAdapter<String>(mCtx, android.R.layout.simple_list_item_1, list);
        listView.setAdapter(adapter);

//-------------------------------
@Override
    public void onClick(View v) {
<span style="white-space:pre">	</span>List<String> tmp = new ArrayList<>();
<span style="white-space:pre">	</span>tmp.add("A");
<span style="white-space:pre">	</span>tmp.add("A");
<span style="white-space:pre">	</span>tmp.add("A");
<span style="white-space:pre">	</span>tmp.add("A");
<span style="white-space:pre">	</span>tmp.add("A");
<span style="white-space:pre">	</span>list = tmp;
<span style="white-space:pre">	</span>adapter.notifyDataSetChanged();
}
这里点击事件触发的实际并不能实现数据的刷新,原因是
private List<T> mObjects;
<pre name="code" class="java">public ArrayAdapter(Context context, int resource, List<T> objects) {
        init(context, resource, 0, objects);
    }

private void init(Context context, int resource, int textViewResourceId, List<T> objects) {
        mContext = context;
        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mResource = mDropDownResource = resource;
        mObjects = objects;
        mFieldId = textViewResourceId;
    }
可以看到这里仅仅是做了一个引用。上面list = tmp;做法将变量list重新指向了一块新的内存。

而adapter里面mObjects指向的还是原来的那块数据。adapter里面的数据并发生改变。
可以使用list.addAll(tmp);这样子就可以刷新数据了。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:612954次
    • 积分:9713
    • 等级:
    • 排名:第1890名
    • 原创:309篇
    • 转载:724篇
    • 译文:1篇
    • 评论:48条