Android 具有JSONArray的自定义基本适配器上的notifydatasetchanged()

Android 具有JSONArray的自定义基本适配器上的notifydatasetchanged(),android,notifydatasetchanged,Android,Notifydatasetchanged,我创建了一个自定义的基调配器类,在这个类中我传递活动的上下文和一个JSONArray。我使用这个JSONArray数据来设置所有视图。但是适配器上的notifyDataSetChanged()不工作。要使notifyDataSetChanged()工作,我必须在适配器中传递字符串数组或字符串的arraylist吗?如果我通过JSONArray,它会不起作用吗 我的自定义适配器类代码: public class InboxMessagesAdapter extends BaseAdapter {

我创建了一个自定义的基调配器类,在这个类中我传递活动的上下文和一个JSONArray。我使用这个JSONArray数据来设置所有视图。但是适配器上的notifyDataSetChanged()不工作。要使notifyDataSetChanged()工作,我必须在适配器中传递字符串数组或字符串的arraylist吗?如果我通过JSONArray,它会不起作用吗

我的自定义适配器类代码:

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一起工作的呢?