更新自定义列表视图项属性

时间:2014-08-29 20:26:20

标签: android android-listview

我在我的app中使用listview。我正在使用以下行添加项目列表:

conversationsAdapter.add(user);

并初始化列表

conversationsAdapter=new ArrayAdapter<JsonObject>(this,0) {
    @Override
    public View getView(int c_position,View c_convertView,ViewGroup c_parent) {
        if (c_convertView == null) {
            c_convertView=getLayoutInflater().inflate(R.layout.random_bars,null);
        }
        JsonObject user=getItem(c_position);
        String name=user.get("name").getAsString();
        String image_url="http://domain.com/photos/profile/thumb/"+user.get("photo").getAsString();
        TextView nameView=(TextView)c_convertView.findViewById(R.id.tweet);
        nameView.setText(name);
        ImageView imageView=(ImageView)c_convertView.findViewById(R.id.image);
        Ion.with(imageView)
        .placeholder(R.drawable.twitter)
        .load(image_url);
        return c_convertView;
    }
};
ListView conversationsListView = (ListView)findViewById(R.id.conversationList);
conversationsListView.setAdapter(conversationsAdapter);
conversationsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
        startChat(conversationsAdapter.getItem(position));
    }
});

我的列表视图如下所示:

enter image description here

我想更新列表中的项目。我该怎么做?

示例:当此方法调用时,我们可以编写类似:changeName的方法,方法设置名称&#34; Tolgay Toklar&#34; to&#34; Tolgay Toklar Test&#34;所以我想更新自定义列表视图项属性。

2 个答案:

答案 0 :(得分:0)

如果您更改列表中的数据,则需要在适配器上调用notifyDatasetCanged以通知列表需要更新基础数据已更改的列表。

示例

List<MyData> data = new ArrayList<MyData>();

private void changeUserName(String name){
    //find the one you need to change from the list here
    .
    .
    .
    data.set(myUpdatedData);
    notifyDatasetChanged()
}

答案 1 :(得分:0)

我完全不同意tyczj。您永远不希望从外部修改ArrayAdapter的列表,是的,它可以仅更新单个项目。让我们从更新单个项目开始。

您只需调用getItem()并直接修改对象并调用notifyDataSetChanged()即可。例如:

JSONObject object = conversationAdapter.getItem(position);
object.put("name", data);
conversationAdapter.notifyDataSetChanged();

为什么这样做?因为适配器将为您提供内部使用的相同对象引用,允许您修改它并更新适配器。没问题。当然,我建议您建立自己的自定义适配器,以便直接在适配器的内部列表中执行此操作。作为替代方案,我强烈建议您使用ArrayBaseAdapter。它已经为您提供了这种能力,同时修复了Android的ArrayAdapter中的其他主要错误。

那么为什么tyczj修改外部列表是错误的?简单。 保证您的外部列表与适配器相同。在ArrayAdapter上执行过滤器后,外部列表和适配器将不再相同。您可以进入一个危险的情况,其中(例如)索引5不再代表适配器中的位置5,因为您稍后向适配器添加了一个项目。我建议您阅读Problems with ArrayAdapter's Constructors以获得更多信息。

更新:外部列表失败的方式

让我们假设您创建一个要传递给ArrayAdapter的对象列表。例如:

List<Data> mList = new ArrayList<Data>();
//...Load list with data
ArrayAdapter<Data> adapter = new ArrayAdapter<Data>(context, resource, mList);
mListView.setAdapter(adapter);

到目前为止一切顺利。你有你的外部列表,你有一个适配器实例化它并分配给listview。现在让我们稍后说,适配器被过滤并清除。

adapter.filter("test");
//...later cleared
adapter.filter("");

此时此mList NOT 与适配器相同。所以如果适配器被修改:

adapter.add(newDataObject);

您会发现mList不包含该新数据对象。因此,当过滤器创建 NEW ArrayList实例时,为什么像这样的外部列表会很危险?它不会继续使用您引用的mList。您甚至可以尝试在此时向mList添加项目,但它不会反映在适配器中。