![](/img/trans.png)
[英]How to add data to custom BaseAdapter for listView - Android
[英]Add item to Android ListView with BaseAdapter
在回调来自数据库之后,我正在尝试将一个项添加到我的列表视图中。
这是我的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无效,但都没有工作。 这应该没关系,但为了完整起见,我的Callback来自Socket.IO
编辑:这里有更多代码:应该调用mAdapter.updateList()
的Socket.IO Callback:
.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
的fullk代码:
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
不支持这个?
只需在适配器类中创建方法,如下所示,
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();
}
}
在您的Activity类中,使用更新列表调用方法,如下所示,
mMessageList.add(message);
mAdapter.updateList(mMessageList);
就这样。 它将在适配器类中定义notifyDataSetChanged()时自动刷新。
将数据传递给适配器:
mAdapter = new MessageItemAdapter(getActivity(), mMessageList );
并在构造函数中添加此参数:
public MessageItemAdapter(Context context, ArrayList<YourClass> data) {
mInflater = LayoutInflater.from(context);
mMessageList = data;
}
现在,您只能使用更新列表中的数据
mAdapter.notifyDataSetChanged();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.