ArrayAdapter不会自动刷新

时间:2015-08-06 06:12:02

标签: android listview android-arrayadapter

我有一个自定义arrayadapter,随着listview中的新数据不断增长。但是,当我使用adapter.add向底层适配器添加新数据然后调用notifyDataSetChanged()时,适配器会更新,但它不会像我期望的那样自动刷新。它只在我尝试滚动时刷新。我希望listview能够自动刷新。我一直在寻找它,它告诉我使用notifysetdatachanged。我哪里出错了?

以下是我的代码:

/opt/java/jdk1.7.0_79

我称之为datachanged的另一个片段:

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

3 个答案:

答案 0 :(得分:0)

当您使用Array Adapter时,使用Array Adapter的add()添加对象时,它会在Array的末尾添加Object,因此您必须滚动到List的末尾才能看到新数据在列表视图上,您​​可以使用类似这样的内容

  

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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