【问题标题】:getView() (for a Custom ListView ) doesn't get called on notifyDatasetChanged()getView() (对于自定义 ListView )不会在 notifyDatasetChanged() 上调用
【发布时间】:2010-12-30 14:13:01
【问题描述】:

我遇到以下问题,找了一阵子,网上也没有解决办法:

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

<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);
 }

}

在主要活动中,我有一个自定义列表视图:lvMainListView,带有一个自定义适配器(其类扩展了 ArrayAdapter - 当然:覆盖方法 getView ),适配器的数据集是:ArrayList&lt;Friend&gt; 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;
  }
 }
  • 问题是当我将朋友的状态从离线更改为在线,然后调用 notifyDataSetChanged(),没有任何反应:该朋友的状态图标没有改变。
    我尝试调试,看到代码: notifyDataSetChanged() 被调用,但自定义 getView() 没有被触发!

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

提前谢谢你,
儿子

【问题讨论】:

    标签: android


    【解决方案1】:

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

        lvFriendList.post(new Runnable() {
    
            @Override
            public void run() {
                adapter.notifyDataSetChanged();         
            }
        });
    

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

    【讨论】:

    • 谢谢,你救了我几个小时的愤怒 :)
    • 这是否意味着我也必须在下面这样做? @Override protected void onPostExecute(Boolean isSearchItemNotFound) { mAgendaAdapterObj.notifyDataSetChanged(); mAgendaRv.setAdapter(mAgendaAdapterObj); }
    【解决方案2】:

    我遇到了同样的问题。你需要添加

    @Override
    public int getCount() {
        return YOURLIST.length;
    }
    

    在您的适配器文件中

    【讨论】:

      猜你喜欢
      • 2021-04-20
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多