gpt4 book ai didi

android - getView() (对于自定义 ListView )不会在 notifyDatasetChanged() 上被调用

转载 作者:行者123 更新时间:2023-11-29 14:18:57 28 4
gpt4 key购买 nike

我遇到了以下问题,在网上找了一段时间也没有找到解决办法:

我有一个自定义 ListView ,每个项目都有以下布局(我只发布必要的):

<LinearLayout>
<ImageView android:id="@+id/friendlist_iv_avatar" />
<TextView andorid:id="@+id/friendlist_tv_nick_name" />
<ImageView android:id="@+id/friendlist_iv_status_icon" />
</LinearLayout>

我有一个 FriendRowItem 类,它是从上面的布局扩展而来的:

public class FriendRowItem extends LinearLayout{

private ImageView ivAvatar;
private ImageView ivStatusIcon;
private TextView tvNickName;

public FriendRowItem(Context context) {
super(context);
RelativeLayout friendRow = (RelativeLayout) Helpers.inflate(context, R.layout.friendlist_row);
this.addView(friendRow);
ivAvatar = (ImageView)findViewById(R.id.friendlist_iv_avatar);
ivStatusIcon = (ImageView)findViewById(R.id.friendlist_iv_status_icon);
tvNickName = (TextView)findViewById(R.id.friendlist_tv_nick_name);

}

public void setPropeties(Friend friend) {
//Avatar
ivAvatar.setImageResource(friend.getAvatar().getDrawableResourceId());

//Status
Status.Type status = friend.getStatusType();
if ( status == Type.ONLINE) {
ivStatusIcon.setImageResource(R.drawable.online_icon);
} else {
ivStatusIcon.setImageResource(R.drawable.offline_icon);
}

//Nickname
String name = friend.getChatID();
if ( friend.hasName()) {
name = friend.getName();
}
tvNickName.setText(name);
}

}

在主要 Activity 中,我有一个自定义 ListView :lvMainListView,带有一个自定义适配器(其类扩展 ArrayAdapter - 当然:覆盖方法 getView ),适配器的数据集是:ArrayList<Friend> friends :

private class FriendRowAdapter extends ArrayAdapter<Friend>  { 

public FriendRowAdapter(Context applicationContext, int friendlistRow,
ArrayList<Friend> friends) {
super(applicationContext, friendlistRow, friends);
}

@Override
public View getView(int position,View convertView,ViewGroup parent) {
Friend friend = getItem(position);
FriendRowItem row = (FriendRowItem) convertView;
if ( row == null ) {
row = new FriendRowItem(ShowFriendsList.this.getApplicationContext());
}
row.setPropeties( friend );
return row;
}
}
  • 问题是当我将 friend 的状态从离线更改为在线,然后调用 notifyDataSetChanged() 时,没有任何反应:那个 friend 的状态图标没有改变。
    我尝试调试,看到代码:notifyDataSetChanged() 被调用,但自定义 getView() 未被触发!

你能告诉我,这在 Android 中是正常的,还是我做错了什么? (我使用的是 Android 1.5)。

提前谢谢你,
儿子

最佳答案

对不起,
我刚刚发现:因为我在另一个线程中调用了 notifyDatasetChanged() 方法(事实上,我正在使用 Smack API 开发聊天客户端 - 并且在 smack 的监听器中调用了方法 notifyDatasetChanged() ,它在turn 在另一个线程中运行)。
正确的解决方案:notifyDatasetChanged 应该这样调用:

    lvFriendList.post(new Runnable() {

@Override
public void run() {
adapter.notifyDataSetChanged();
}
});

我希望这会节省一些时间,如果他们遇到同样的问题:)。

关于android - getView() (对于自定义 ListView )不会在 notifyDatasetChanged() 上被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4563262/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com