在此代码中,在向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*/
}
}
答案 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实例所做的每一个更改都会影响它的数据集。