我有以下问题,并搜索了一段时间,但没有从网上得到任何解决方案:
我有一个自定义列表视图,每个项目都有以下布局(我只发帖必备):
<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>
Run Code Online (Sandbox Code Playgroud)
我有一个类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);
}
}
Run Code Online (Sandbox Code Playgroud)
在主要活动中,我有一个自定义列表视图: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;
}
}
Run Code Online (Sandbox Code Playgroud)
你能否告诉我,这在Android中是正常的,还是我做错了什么?(我使用的是Android 1.5).
先生,谢谢你,
儿子
hun*_*175 13
对不起,
我刚刚发现:因为我在另一个线程中调用了notifyDatasetChanged()方法(事实上,我正在使用Smack API开发一个聊天客户端 - 并且方法notifyDatasetChanged()在一个监听器中被调用smack,反过来又在另一个线程中运行).
正确的解决方案:notifyDatasetChanged应该像这样调用:
lvFriendList.post(new Runnable() {
@Override
public void run() {
adapter.notifyDataSetChanged();
}
});
Run Code Online (Sandbox Code Playgroud)
如果他们遇到同样的问题,我希望这可以节省时间:).
| 归档时间: |
|
| 查看次数: |
6854 次 |
| 最近记录: |