我有一个自定义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;
}
答案 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());
}
});