notifydatasetchanged() для пользовательского базового адаптера с JSONArray

Я создал собственный базовый класс адаптера, в который я передаю контекст активности и JSONArray. Я использую эти данные JSONArray для установки всех представлений. Но notifyDataSetChanged() на адаптере не работает. Должен ли я передавать массив строк или массив строк в адаптер для работы notifyDataSetChanged()? Это не сработает, если я передам 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;
}
}

person berserk    schedule 07.03.2014    source источник
comment
Почему вы прошли JsonArray? сохранить данные в ArrayList и передать ArrayList   -  person M D    schedule 07.03.2014
comment
Лучший способ - передать arraylist в качестве параметра, в котором все ваши данные Json находятся в конструкторе адаптера.   -  person Piyush    schedule 07.03.2014
comment
@SimplePlan Вы хотите сказать, что JSONArray здесь не работает?   -  person berserk    schedule 07.03.2014
comment
@PiyushGupta Вы хотите сказать, что JSONArray здесь не работает?   -  person berserk    schedule 07.03.2014
comment
@berserk я не говорю, что это не работает, но лучший способ - поместить все ваши данные в ArrayList и передать Adapter   -  person M D    schedule 07.03.2014
comment
@берсерк Почему бы и нет. Это должно быть работа   -  person Piyush    schedule 07.03.2014
comment
@SimplePlan Можете ли вы объяснить, почему он не работает?   -  person berserk    schedule 07.03.2014
comment
@PiyushGupta Можете ли вы объяснить, почему это не работает?   -  person berserk    schedule 07.03.2014
comment
Это очень плохая производительность, чтобы все циклы процессора находились внутри метода getView адаптера.   -  person Daniel Conde Marin    schedule 07.03.2014
comment
@Daniel Вы хотите сказать, что я должен разобрать каждый JSONObject на массивы строк перед отправкой на адаптер?   -  person berserk    schedule 07.03.2014
comment
@berserk: да, знаю, иначе при прокрутке listView вы, вероятно, увидите некоторую задержку, потому что каждый раз, когда элемент listView отображается, он должен вызывать getView.   -  person Daniel Conde Marin    schedule 07.03.2014
comment
@Daniel О, теперь я понял, спасибо :) Но основная проблема все еще не решена.   -  person berserk    schedule 07.03.2014


Ответы (2)


вы должны обновить другой объект arrayOfMessages, создать функцию в адаптере, например:

public void setArrayOfMessages(JSONArray arrayOfMessages){
this.arrayOfMessages=arrayOfMessages;
}

и перед вызовом notifyDataSetChanged все это:

adapter.setArrayOfMessages(object);
adapter.notifyDataSetChanged();
person vipul mittal    schedule 07.03.2014
comment
Спасибо за пост :) Если это так, то как обновился массив? Я сделал то же самое, но заменил JSONArray на arraylist, и это работает. - person berserk; 07.03.2014
comment
в случае списка массивов, если вы измените ссылку, это не сработает. Что вы делаете, так это очищаете список и добавляете новый элемент, сохраняя при этом ту же ссылку на список, которая была добавлена ​​в адаптер. - person vipul mittal; 07.03.2014
comment
Ну, я сделал это так же, как и с JSONArray. Все то же самое. Список массивов, используемый для установки представлений, является глобальным списком массивов, который инициализируется в конструкторе. Я хочу сказать, что в обоих случаях все одинаково, только типы данных разные (JSONArray и Arraylist‹String›). Итак, как это работает с arraylist, а не с JSONArray? - person berserk; 07.03.2014

Лучше перенесите свои данные из Json Array в Arraylist или List, а затем примените notifyDataSetChanged.

person pratiti-systematix    schedule 07.03.2014