【问题标题】:ArrayAdapter not auto-refreshingArrayAdapter 不自动刷新
【发布时间】:2015-08-06 06:12:01
【问题描述】:

我有一个自定义数组适配器,并且随着新数据进入列表视图,它会不断增长。但是,当我使用 adapter.add 将新数据添加到底层适配器然后调用 notifyDataSetChanged() 时,适配器会更新,但不会像我期望的那样自动刷新。它仅在我尝试滚动时刷新。我希望列表视图自动刷新。我一直在到处寻找,它告诉我使用 notifysetdatachanged。我哪里做错了?

下面是我的代码:

class MyArrayAdapter extends ArrayAdapter {
public MyArrayAdapter(Context context) {
        super(context, R.layout.chat_list, messages);
    }

   //        @Override
    public View getView(int position, View convertView, ArrayList<String> messages, ViewGroup parent) {
         final Viewholder viewholder;
        if(convertView == null)
        {
            LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.chat_list, parent, false);
            viewholder = new Viewholder();
            viewholder.message = (TextView) convertView.findViewById(R.id.text1);
            convertView.setTag(viewholder);
        }
        else {
            viewholder = (Viewholder) convertView.getTag();
        }
        viewholder.message.setText(chat.messages.get(position).toString());

        return convertView;
    }

    @Override
    public int getCount() {
        return messages.size();
    }

}
static class Viewholder
{
    TextView message;
}

另一个我称之为datachanged的sn-p:

Message new_message = (Message) packet;
                 if(new_message.getBody() != null)
                 {
                     Log.v("LogCat", "Message Received from " + new_message.getFrom() + " and as " + new_message.getBody());

                     messages.add("From: " + new_message.getFrom().toString());
                     messages.add(new_message.getBody());

                     myadapter.add(new_message.getFrom().toString());  // i also tried to disable this.. dint work
                     myadapter.add(new_message.getBody());


                     mHandler.post(new Runnable() {
                         @Override
                         public void run() {
                             myadapter.notifyDataSetChanged();

                         }
                     });
                 }
             }

【问题讨论】:

  • ArrayAdapter#add 已经调用了notifyDataSetChanged,不需要,你可以通过调用ArrayAdapter#setNotifyOnChange来禁用它
  • 谢谢.. 我会删除那行。但是自动刷新呢。

标签: android listview android-arrayadapter


【解决方案1】:

当您使用数组适配器时,当您使用数组适配器的 add() 添加对象时,它会将对象添加到数组的末尾,因此您必须滚动到列表的末尾才能看到新的数据在列表视图上,您​​可以使用类似的东西

mListView.smoothScrollToPosition (mAdatper.getCount() - 1)

以编程方式滚动到列表视图的末尾以查看添加的新数据。

【讨论】:

  • 我从列表视图中的零项开始。我刚刚尝试了你的答案,但它也没有做任何事情。我必须通过触摸屏幕手动刷新列表视图。
【解决方案2】:

对于那些可能会遇到同样情况的人。我不得不像这样改变它,这可能不是正确的方法: messages 是适配器引用的基础对象数组。

messages.add("From: " + new_message.getFrom().toString());
messages.add(new_message.getBody());

mHandler.post(new Runnable() {
@Override
public void run() {
   myadapter.notifyDataSetChanged();
}
});

【讨论】:

  • 不,这不是正确的方法:ArrayAdapter#add() 是,只需创建一个简单的项目并尝试一下
  • 是的,它可以工作,因为 arrayadapter 引用了消息对象。但是如果我们想改变一些关于视图的信息,用我的方式,它可能会变得简单,我相信。我们可以更改消息(位置)并调用 notifydatachaged。我可能错了
【解决方案3】:

对我来说,问题是我没有从创建适配器的同一个线程调用 adapter.add() 。所以尝试以下方法:

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        myadapter.add(new_message.getFrom().toString());  
        myadapter.add(new_message.getBody());
    }
});

【讨论】:

    猜你喜欢
    • 2010-12-30
    • 1970-01-01
    • 2013-04-19
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多