Android 更新自定义listview项属性

Android 更新自定义listview项属性,android,android-listview,Android,Android Listview,我正在应用程序中使用listview。我正在使用此行将项目添加到列表中: conversationsAdapter.add(user); 这个初始化列表 conversationsAdapter=new ArrayAdapter<JsonObject>(this,0) { @Override public View getView(int c_position,View c_convertView,ViewGroup c_parent) { if (

我正在应用程序中使用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));
    }
});
conversationsAdapter=newarrayadapter(这个,0){
@凌驾
公共视图getView(内部c_位置、视图c_转换视图、视图组c_父视图){
如果(c_convertView==null){
c_convertView=GetLayoutFlater().充气(R.layout.random_条,空);
}
JsonObject user=getItem(c_位置);
String name=user.get(“name”).getAsString();
字符串图像\u 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(图像\u url);
返回c_转换视图;
}
};
ListView会话ListView=(ListView)findViewById(R.id.conversationList);
setAdapter(conversationsAdapter);
conversationsListView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
startChat(会话适配器.getItem(位置));
}
});
我的列表视图如下所示:

我想更新列表中的一项。如何更新


示例:我们可以编写如下方法:
changeName
当该方法调用时,该方法将名称“Tolgay-Toklar”设置为“Tolgay-Toklar-Test”因此,我想更新自定义listview项属性。

如果更改列表中的数据,则需要在适配器上调用
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()
}
List data=new ArrayList();
私有void changeUserName(字符串名称){
//从这里的列表中找到需要更改的项
.
.
.
data.set(myupdatedata);
notifyDatasetChanged()
}

我完全不同意tyczj的观点。您永远不想从外部修改ArrayAdapter的列表,而且可以只更新单个项目。让我们从更新单个项目开始

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

JSONObject object = conversationAdapter.getItem(position);
object.put("name", data);
conversationAdapter.notifyDataSetChanged();
为什么这样做有效?因为适配器将向您提供内部使用的相同对象引用,允许您修改它并更新适配器。没问题。当然,我建议您构建自己的自定义适配器,以便直接在适配器的内部列表上执行此操作。作为替代方案,我强烈建议使用。它已经为您提供了这种能力,同时用Android的ArrayAdapter修复了其他一些主要的bug

那么为什么tyczj修改外部列表是错误的呢?简单。没有可以保证您的外部列表与适配器相同。在ArrayAdapter上执行筛选后,外部列表和适配器将不再相同。您可能会进入一个危险的场景,例如索引5不再代表适配器中的位置5,因为您后来向适配器添加了一个项。我建议你多读一点

更新:外部列表如何失败

假设您创建了一个要传递到ArrayAdapter的对象列表。例如:

List<Data> mList = new ArrayList<Data>();
//...Load list with data
ArrayAdapter<Data> adapter = new ArrayAdapter<Data>(context, resource, mList);
mListView.setAdapter(adapter);
此时,
mList
与适配器不同。因此,如果修改了适配器:

adapter.add(newDataObject);

您会发现mList不包含该新数据对象。因此,当筛选器创建一个新的ArrayList实例时,这样的外部列表可能会很危险。它将不会继续使用您的
mList
引用列表。此时,您甚至可以尝试将项目添加到
mList
,但它不会反映在适配器中。

我知道。我在问如何更改列表中的数据。您是什么意思,您的数据在某个地方,请在您保存数据的地方进行更改。我正在会话中保存数据,但我不知道如何更新项目。您能举个例子吗?请参阅我的编辑。如果不知道如何保存数据,我真的不能做更多的事情,但我想更改特定项。我怎么做?你认为notifyDatasetChanged()的具体功能是什么?它用新数据更新适配器。我还说过,你需要在列表中找到需要修改的正确对象,当你在列表中找到想要的对象并替换它时,位置不可能不正确。如果你按照你的建议修改外部列表,位置可能不正确。查看ArrayAdapter过滤器的源代码。您将看到,这些内部列表将获得新的列表引用。因此,虽然它们存储的对象是相同的…但它们的列表不是:@JaySoyer我是这样使用的:但是我得到了一个错误:方法put(String,String)对于类型JsonObject是未定义的。我如何修复它?@JaySoyer你也可以看看这个吗?您应该使用
JSONObject
类。Ie:
import org.json.JSONObject
adapter.add(newDataObject);