Android 具有JSONArray的自定义基本适配器上的notifydatasetchanged()
我创建了一个自定义的基调配器类,在这个类中我传递活动的上下文和一个JSONArray。我使用这个JSONArray数据来设置所有视图。但是适配器上的notifyDataSetChanged()不工作。要使notifyDataSetChanged()工作,我必须在适配器中传递字符串数组或字符串的arraylist吗?如果我通过JSONArray,它会不起作用吗 我的自定义适配器类代码:Android 具有JSONArray的自定义基本适配器上的notifydatasetchanged(),android,notifydatasetchanged,Android,Notifydatasetchanged,我创建了一个自定义的基调配器类,在这个类中我传递活动的上下文和一个JSONArray。我使用这个JSONArray数据来设置所有视图。但是适配器上的notifyDataSetChanged()不工作。要使notifyDataSetChanged()工作,我必须在适配器中传递字符串数组或字符串的arraylist吗?如果我通过JSONArray,它会不起作用吗 我的自定义适配器类代码: public class InboxMessagesAdapter extends BaseAdapter {
public class InboxMessagesAdapter extends BaseAdapter {
Activity act;
SharedPreferences prefs;
LayoutInflater Inflater;
JSONArray arrayOfMessages;
public InboxMessagesAdapter(Activity a, JSONArray arry) {
act = a;
arrayOfMessages = arry;
prefs = PreferenceManager.getDefaultSharedPreferences(a);
Inflater = (LayoutInflater) act
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return arrayOfMessages.length();
}
@Override
public Object getItem(int arg0) {
return arg0;
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
View v1 = arg1;
try {
final int x = arg0;
JSONObject js = arrayOfMessages.getJSONObject(arg0);
v1 = Inflater.inflate(R.layout.element_inbox, null);
TextView titleOfMessage = (TextView) v1
.findViewById(R.id.msg_inbox_title);
TextView timeOfMessage = (TextView) v1
.findViewById(R.id.msg_inbox_time);
final CheckBox selectMessage = (CheckBox) v1
.findViewById(R.id.msg_inbox_check_button);
ImageView attachment = (ImageView) v1
.findViewById(R.id.msg_inbox_attachment);
ImageView starStatus = (ImageView) v1
.findViewById(R.id.msg_inbox_addtofav);
if (js.getString("StarStatus").equals("0"))
starStatus.setImageResource(R.drawable.btn_add_to_fav_normal);
else
starStatus.setImageResource(R.drawable.btn_add_to_fav_pressed);
if (js.getString("AttachmentStatus").equals("0"))
attachment.setVisibility(View.GONE);
titleOfMessage.setText(js.getString("MessageSubject"));
String arr[] = js.getString("MessageDate").split(" ");
try {
timeOfMessage.setText(arr[1] + arr[2]);
} catch (Exception e) {
timeOfMessage.setText(js.getString("MessageDate"));
}
v1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
try {
Intent in = new Intent(act, MessageActivity.class);
in.putExtra("data", arrayOfMessages.getJSONObject(x)
.toString());
act.startActivity(in);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
return v1;
}
}
最好将Json数组中的数据放入Arraylist或List中,然后应用notifyDataSetChanged。您必须更新不同的
arrayOfMessages对象。
在适配器中创建一个函数,如:
public void setArrayOfMessages(JSONArray arrayOfMessages){
this.arrayOfMessages=arrayOfMessages;
}
在调用notifyDataSetChanged
所有这些之前:
adapter.setArrayOfMessages(object);
adapter.notifyDataSetChanged();
为什么要通过JsonArray?将数据存储在
ArrayList
中并传递ArrayList
最好的方法是将ArrayList作为参数传递给适配器构造函数中的所有Json数据。@SimplePlan你的意思是说JSONArray在这里不起作用吗?@PiyushGupta你的意思是说JSONArray在这里不起作用吗?@berserk我不是说它不起作用,但最好的方法是您将所有数据放入ArrayList
并传递到Adapter
感谢您的帖子:)如果是这种情况,ArrayList是如何自我更新的?我也做了同样的事情,但是用arraylist替换了JSONArray,它可以工作。在数组列表的情况下,如果更改引用,它将无法工作。您要做的是清除列表并添加新元素,从而保持添加到适配器的列表的相同引用。一切都一样。用于设置视图的arraylist是在Constructor中初始化的全局arraylist。我的意思是,在这两种情况下,一切都是一样的,只是数据类型不同(JSONArray和Arraylist)。那么,它是如何与arraylist而不是JSONArray一起工作的呢?