首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用BaseAdapter将项目添加到Android BaseAdapter

用BaseAdapter将项目添加到Android BaseAdapter
EN

Stack Overflow用户
提问于 2014-12-11 06:15:30
回答 2查看 4.7K关注 0票数 1

在回调来自数据库之后,我试图在listview中添加一个项。

这是我的onCreateView

代码语言:javascript
复制
private MessageItemAdapter mAdapter;
private List<DMessage> mMessageList;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mAdapter = new MessageItemAdapter(getActivity());
// ...

在我的AsyncTask

代码语言:javascript
复制
// ...
mResultList.setAdapter(mAdapter);
// ...

我的适配器

代码语言:javascript
复制
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());
// ...

最后,在我将新消息插入数据库后,我得到了回调,在那里我尝试刷新列表:

代码语言:javascript
复制
mMessageList.add(message);
mAdapter.notifyDataSetChanged();

mMessageList得到了正确的更新,不幸的是,notifyDataSetChanged()并没有刷新listView。因为这不起作用,我也尝试了一些(不好的)东西,比如重新启动异步任务,使我的ListView无效,但都没有起作用。这不重要,但为了完整起见,我的回调是通过Socket.IO进行的。

编辑:这里有更多代码:应该调用mAdapter.updateList()的Socket.IO回调

代码语言:javascript
复制
.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的完整代码

代码语言:javascript
复制
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不支持这个?

EN

回答 2

Stack Overflow用户

发布于 2014-12-11 06:33:54

只需按以下方式在适配器类中创建方法,

代码语言:javascript
复制
   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();
          }


    }

在活动类中,使用更新的列表调用方法,如下所示,

代码语言:javascript
复制
   mMessageList.add(message);
   mAdapter.updateList(mMessageList);

仅此而已。在适配器类中定义notifyDataSetChanged()时,它将自动刷新。

票数 3
EN

Stack Overflow用户

发布于 2014-12-11 06:23:02

将数据传递给适配器:

代码语言:javascript
复制
mAdapter = new MessageItemAdapter(getActivity(), mMessageList );

并在构造函数中添加此参数:

代码语言:javascript
复制
public MessageItemAdapter(Context context, ArrayList<YourClass> data) {
        mInflater = LayoutInflater.from(context);
        mMessageList = data;
}

现在,您只能通过以下方式更新列表中的数据

代码语言:javascript
复制
mAdapter.notifyDataSetChanged();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27416510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档