Android ArrayAdapter notifyDataSetChanged不起作用

时间:2014-10-11 07:11:14

标签: android listview

在此代码中,在向adaper插入新项目后,我的列表无法使用notifyDataSetChanged()进行刷新和更新。例如,对于此行,我的适配器可以设置没有任何问题:

getRequestFromServer(0, 10);
adapter = new ReceivedAdapter(G.context, items);
setListAdapter(adapter);

之后我在列表和适配器中有10个项目。

private String getRequestFromServer(long lastID, int count) {
    String received = "";
    try {
        received = new JsonService(config_username, config_password, lastID, count, G.F_RECEIVE_SMS).request();
        JSONArray data_array = new JSONArray(received);

        String mUserID = config_username;
        for (int i = 0; i < data_array.length(); i++) {
            JSONObject json_obj = data_array.getJSONObject(i);

            String mLastID = json_obj.getString("id_recived_sms");
            String mSmsBody = json_obj.getString("sms_body");
            String mSmsNumber = json_obj.getString("sms_number");
            String mSenderName = json_obj.getString("mobile_number");
            String mContactName = json_obj.getString("contact_name");
            String mDate = json_obj.getString("recived_date");

            ReceivedItemStructure item = new ReceivedItemStructure(
                    mLastID,
                    mUserID,
                    mSmsBody,
                    mSmsNumber,
                    mSenderName,
                    mContactName,
                    mDate
            );
            items.add(item);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return received;
}

items.add(item);计数是10。现在,在从服务器获取新项目后,在下面这个函数中,我的列表计数可以更改并更新为11:

private void addDataToList(String LastID, String SmsBody, String SmsNumber, String SenderName, String ContactName, String Date) {
    String mLastID      = LastID;
    String mUserID      = config_username;
    String mSmsBody     = SmsBody;
    String mSmsNumber   = SmsNumber;
    String mSenderName  = SenderName;
    String mContactName = ContactName;
    String mDate = Date;
    ReceivedItemStructure item = new ReceivedItemStructure(
            mLastID,
            mUserID,
            mSmsBody,
            mSmsNumber,
            mSenderName,
            mContactName,
            mDate
    );
    items.add(item);
    adapter.update(items);
    adapter.notifyDataSetChanged();
}

items.add(item);计数是11。我使用adapter.update()更新了适配器,并且在使用addDataToList()函数{@ 1}}后我的列表中的适配器是11,但adapter.notifyDataSetChanged();不起作用,我看不到适配器和列表视图中的新项。在items中插入和添加新项目总是行,我没有任何问题。

我的适配器是:

public class ReceivedAdapter extends ArrayAdapter<ReceivedItemStructure> {

    private ArrayList<ReceivedItemStructure> list;

    public ReceivedAdapter(Context c, ArrayList<ReceivedItemStructure> items) {
        super(c,0,items);
        list = items;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ReceiveItemView itemView = (ReceiveItemView)convertView;
        if (null == itemView)
            itemView = ReceiveItemView.inflate(parent);

        itemView.setItem(getItem(position));
        return itemView;
    }

    public void update(ArrayList<ReceivedItemStructure> items) {
        list = items;
        /* this line could update list method*/
    }
}

1 个答案:

答案 0 :(得分:1)

更改以下代码:

items.add(item);
adapter.update(items);
adapter.notifyDataSetChanged();

为:

adapter.add(item);
adapter.notifyDataSetChanged();

我认为这可以解决你的问题。

您不需要使用列表将项目存储在扩展ArrayAdatper的适配器中,因为它将为您维护一个项目列表。

<强>更新

然后尝试将商品列表的副本传递给适配器。请尝试以下更改:

adapter = new ReceivedAdapter(G.context, items);

为:

adapter = new ReceivedAdapter(G.context, new ArrayList<ReceivedItemStructure>(items));

当你通过构造函数将List实例传递给ArrayAdapter时,它将比实例直接保存,意味着你对ArrayAdapter之外的List实例所做的每一个更改都会影响它的数据集。