0

ListViewアイテムを1つずつ追加しようとしています。つまり、60個のアイテムがある場合、アプリケーションは一度に1つずつリストビューにビューを追加します。したがって、アプリケーションがさらに多くのものをロードしていることをユーザーに示します。

これは私のコードです:

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メソッド内でも出力されません。

4

1 に答える 1

1
  • 確かに、アダプタに何か問題があります。ListViewに表示する必要のあるビューを自分で保存しないでください。ビューの作成に必要なデータのみを保存し、アダプターのgetViewメソッドを上書きして必要なビューを作成します。

  • 2つ目は、バックグラウンドタスクで使用しているリストが、 doInBackgroundメソッド
    のスコープでのみ表示されることです。
    このリストを変更しても
    、UIに影響はありません。

  • バックグラウンドスレッドを開始する前に、JsonArrayをアダプタに渡します。アダプタが正しく機能している場合は、バックグラウンドスレッドが機能し始める前に、ListViewが完全に機能している必要があります。空のJsonArrayをListViewに渡す必要があります。また、 ArrayAdapterを拡張する場合は、公開の進行状況メソッドでaddItemを使用できます。

Adapterクラスの命名に関して少し関係のないこと。あなたはそれをcreateSpecialAdapterと呼びました。これはメソッド名のように聞こえますが、クラス名です。すべてのクラス名を大文字で始めて、SpecialAdapterのようにそれらが表すものの名前を付けるようにしてください。

于 2010-07-06T06:29:31.470 に答える