繁体   English   中英

使用BaseAdapter将项添加到Android ListView

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM