在回调来自数据库之后,我试图在listview中添加一个项。
这是我的onCreateView
private MessageItemAdapter mAdapter;
private List<DMessage> mMessageList;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mAdapter = new MessageItemAdapter(getActivity());
// ...在我的AsyncTask里
// ...
mResultList.setAdapter(mAdapter);
// ...我的适配器
class MessageItemAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public MessageItemAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
// ....
if (convertView == null) {
view = mInflater.inflate(R.layout.message_list, parent, false);
holder = new ViewHolder();
// ...
holder.message.setText(mMessageList.get(position).getMessage());
// ...最后,在我将新消息插入数据库后,我得到了回调,在那里我尝试刷新列表:
mMessageList.add(message);
mAdapter.notifyDataSetChanged();mMessageList得到了正确的更新,不幸的是,notifyDataSetChanged()并没有刷新listView。因为这不起作用,我也尝试了一些(不好的)东西,比如重新启动异步任务,使我的ListView无效,但都没有起作用。这不重要,但为了完整起见,我的回调是通过Socket.IO进行的。
编辑:这里有更多代码:应该调用mAdapter.updateList()的Socket.IO回调
.on("send back new message", new Emitter.Listener() {
@Override
public void call(Object... args) {
JSONObject jObj = (JSONObject) args[0];
try {
DMessage message = prepareMessageObject(jObj);
if (message != null) {
mMessageList.add(message);
mAdapter.updateList(mMessageList);
}
} catch (Exception e) {...}
}
});和MessageItemAdapter的完整代码
class MessageItemAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private ArrayList<DMessage> messageList;
public MessageItemAdapter(Context context, ArrayList<DMessage> data) {
this.mInflater = LayoutInflater.from(context);
this.messageList = data;
}
private class ViewHolder {
public TextView name;
public TextView message;
}
@Override
public int getCount() {
return messageList.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public void updateList(ArrayList<DMessage> data) {
messageList = data;
notifyDataSetChanged();
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
final ViewHolder holder;
if (convertView == null) {
view = mInflater.inflate(R.layout.message_list, parent, false);
holder = new ViewHolder();
holder.message = (TextView) view.findViewById(R.id.message_list_message);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.message.setText(messageList.get(position).getMessage()));
return view;
}
}溶液
我不知道到底是什么问题,但是在我切换到ArrayAdapter之后,它工作得很好。ListView附加新行correclty。我想也许BaseAdapter不支持这个?
发布于 2014-12-11 06:33:54
只需按以下方式在适配器类中创建方法,
class MessageItemAdapter extends BaseAdapter {
public MessageItemAdapter(Context context, ArrayList<YourClass> data) {
mInflater = LayoutInflater.from(context);
mMessageList = data;
}
/*
* Update and refresh list
*/
public void updateList(ArrayList<YourClass> data) {
mMessageList = data;
notifyDataSetChanged();
}
}在活动类中,使用更新的列表调用方法,如下所示,
mMessageList.add(message);
mAdapter.updateList(mMessageList);仅此而已。在适配器类中定义notifyDataSetChanged()时,它将自动刷新。
发布于 2014-12-11 06:23:02
将数据传递给适配器:
mAdapter = new MessageItemAdapter(getActivity(), mMessageList );并在构造函数中添加此参数:
public MessageItemAdapter(Context context, ArrayList<YourClass> data) {
mInflater = LayoutInflater.from(context);
mMessageList = data;
}现在,您只能通过以下方式更新列表中的数据
mAdapter.notifyDataSetChanged();https://stackoverflow.com/questions/27416510
复制相似问题