Используйте AsyncTask для добавления элементов в список по отдельности - PullRequest
0 голосов
/ 06 июля 2010

Я пытаюсь добавить элементы ListView один за другим.Так что, если я скажу - 60 элементов - приложение будет добавлять представления в представление списка по одному - таким образом, показывая пользователю, что приложение загружает больше вещей.

Это мой код:

try {
        JSONArray j = getTaggsJSON();
        Log.v(TAG, String.valueOf(j.length()));
        a = new createSpecialAdapter(this, R.layout.individual_tagg_view,
                R.layout.list_item, view, j);
        ListView v = this.getListView();
        v.setStackFromBottom(true);
        setListAdapter(a);
        new addViewsToList().execute(j);

    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ServiceException e) {
        e.printStackTrace();
    }

}

private class addViewsToList extends AsyncTask<JSONArray, View, List<View>> {

    protected List<View> doInBackground(JSONArray... jsonArrays) {
        List<View> v = new ArrayList<View>();
        Log.v(TAG, String.valueOf(jsonArrays[0].length()));
        for (int x = 0; x < jsonArrays[0].length(); x++) {
            try {
                Log.v(TAG, jsonArrays[0].getJSONObject(x).toString());
                v.add(ViewAdapter.createTaggView(jsonArrays[0]
                        .getJSONObject(x), c));
            } catch (JSONException e) {
                e.printStackTrace();
            }
            publishProgress(v.get(x));
        }
        return v;
    }

    protected void onProgressUpdate(View... v) {
        Log.v(TAG, "I'm updating my progress!");
        a.notifyDataSetChanged();
    }

    protected void onPostExecute(List<View> views) {
        Log.v(TAG, "i'm done!");
        Log.v(TAG, String.valueOf(views.size()));
    }
}

Итак, похоже, что мой код правильно распечатывает представления и правильно помещает их в список, однако моя активность ничего не отображает.Что я делаю неправильно?Я думал, что установка адаптера раньше - когда в списке нет представлений - и затем обновление адаптера, когда список был изменен, - это правильный путь .... Очевидно, нет ... Кто-нибудь может мне помочь?

Если вам нужны разъяснения по моим вопросам, пожалуйста, дайте мне знать.

РЕДАКТИРОВАТЬ: Вот код адаптера, чтобы дополнить мой вопрос.

private class SpecialAdapter extends ArrayAdapter<JSONArray> {

    JSONArray json;

    public SpecialAdapter(Context context, int textViewResourceId,
            int listItem, JSONArray j) {
        super(context, textViewResourceId);
        this.json = j;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        Log.v(TAG,"I'm inside the getView method.");
        try {
            JSONObject info = json.getJSONObject(position);
            Log.v(TAG,info.toString());



        if (convertView == null) {
            LayoutInflater i = (LayoutInflater) RecentTaggs.this
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = i.inflate(R.layout.individual_tagg_view, parent,
                    false);
            holder = new ViewHolder();
            holder.username = (TextView) convertView
                    .findViewById(R.id.userName);
            holder.review = (TextView)convertView.findViewById(R.id.review_text);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.review.setText(info.getString("review"));

        return convertView;

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}

Мой вывод не выводит ни одного из моих операторов Log.v и не показывает, что он даже внутри метода GetView.

1 Ответ

1 голос
/ 06 июля 2010
  • Конечно, что-то не так с вашим адаптером. Вы никогда не должны сохранить представления, которые должны отображаться в ListView по своему усмотрению. Только сохранить данные, необходимые для создания Просмотреть и переписать метод getView вашего адаптера для создания необходимого Посмотреть.

  • Вторым моментом является список, который вы Используем в фоновом режиме задачу
    видимый в объеме
    только метод doInBackground. Без изменений к этому списку может повлиять на
    ваш пользовательский интерфейс.

  • Вы передаете JsonArray своему адаптеру перед запуском фонового потока. Если ваш адаптер будет работать правильно, ListView должен быть полностью функциональным, прежде чем фоновый поток даже начнет работать. Вы должны передать пустой JsonArray в ListView, и если вы расширяете ArrayAdapter , вы можете использовать addItem в вашем методе прогресса публикации.

Некоторые немного не связанные вещи с именами вашего класса Adapter. Вы назвали это createSpecialAdapter. Это звучит как имя метода, но это имя класса. Попробуйте начать все имена классов с заглавной буквы и дать им имена вещей, которые они представляют, например SpecialAdapter.

...