我在我的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));
}
});
我的列表视图如下所示:
我想更新列表中的项目。我该怎么做?
示例:当此方法调用时,我们可以编写类似:changeName
的方法,方法设置名称&#34; Tolgay Toklar&#34; to&#34; Tolgay Toklar Test&#34;所以我想更新自定义列表视图项属性。
答案 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
添加项目,但它不会反映在适配器中。