0

私のAndroidアクティビティの1つで、ListView lvFeedsList. の各行要素には、RSSFeedName、publishDate、feedLength のlistView3 つの textView が含まれます。

フィードのコンテンツは から取得されますHTTPRsponse。でこの応答を取得していAsyncTaskます。

そのためdoInBackground()、私は を送信しHTTPRequest、応答を受信して​​解析し、ArrayList上記の 3 つの情報を含むファイルを準備しました。

次に、唯一の内部で、3列の要素を形成するためdoInBackground()のカスタマイズを作成しています。私の意図は、このアダプターを に設定することです。ArrayAdapterTextViewsListView in onPostExecute()

しかし、アプリケーションを実行すると、ListView には何も表示されません。

デバッグしようとしgetView()ましたが、ArrayAdapterクラスが呼び出されていないようです。(しかし、これが理由かどうかはわかりません)。

これがコードです。長くて申し訳ありません...必要に思えました。

活動コード:

public class GenericFeedsActivity extends Activity{

    private ListView lvFeedsList;
    private ArrayList<FeedsClass> feedList;

    protected void onCreate(Bundle savedInstanceState) {
        ...
        lvFeedsList = (ListView) findViewById(R.id.lvFeedsList);
        lvFeedsList.setOnItemClickListener(this);
        lvFeedsList.setEnabled(false);
        ...
        new AsyncResponseHandler(this).execute();
    }

    class AsyncResponseHandler extends AsyncTask {
        Context context;
        FeedListAdapter adapter;

        public AsyncResponseHandler(Context c) {
            this.context = c;
        }

        @Override
        protected Object doInBackground(Object... params) {
            ...
            /* 
             *  Sending HTTPRequest to a URL & getting list of feeds
             *  Saving this list of feeds in a ArrayList -feedList, containing elements of type FeedsClass (declared above)
             *  Below line parses the HTTPResponse XML & stores various information in feedList.
             */
            feedList = utils.parseRssResponseXML(in);   // Working fine, geeting elements
            adapter = new FeedListAdapter(
                GenericFeedsActivity.this, feedList);
            in.close();
            return null;
        }

        protected void onPostExecute(Object e) {
            // Setting Arrayadapter
            lvFeedsList.setAdapter(adapter);
            lvFeedsList.setEnabled(true);
        }
    }
}

アダプターコード:

public class FeedListAdapter extends ArrayAdapter {

    private Context context;
    private ArrayList<FeedsClass> feedList;

    public FeedListAdapter(Context c, ArrayList<FeedsClass> data) {
        super(c, R.layout.rowlayout);
        this.context = c;
        this.feedList = data;
    }

    class ViewHolder {
        TextView tvFeedName;
        TextView tvFeedPubDate;
        TextView tvFeedLength;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ViewHolder holder = null;
            if (row == null) {

                LayoutInflater inflator = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row = inflator.inflate(R.layout.rowlayout, null);
                holder = new ViewHolder();

                holder.tvFeedName = (TextView) row.findViewById(R.id.tvFeedName);
                holder.tvFeedPubDate = (TextView) row.findViewById(R.id.tvFeedPubDate);
                holder.tvFeedLength = (TextView) row.findViewById(R.id.tvFeedLength);

                row.setTag(holder);
            } else {
                holder = (ViewHolder) row.getTag();
            }
            // Getting values of feedName, publishDate & feedLength
            String feedName = feedList.get(position).getTitle();
            String feedDate = feedList.get(position).getPublishDate();
            String feedLength = feedList.get(position).getStreamLength();

            holder.tvFeedName.setText(feedName);
            holder.tvFeedPubDate.setText(feedDate);
            holder.tvFeedLength.setText(feedLength);
        }
        return row;
    }
}
4

2 に答える 2

3

問題は、サブクラス化することですArrayAdapterArrayAdapterデータに要素がないと内部的に見なされるため、これは機能しません。lvFeedsList使用するデータセットは内部にあるため、変数を調べることを魔法のように知っているだけではありません。

代わりに、コンストラクターで、代わりにこのコンストラクターを呼び出すようにしてください。

アダプターコード:

public FeedListAdapter(Context c, ArrayList<FeedsClass> data) {
    super(c, R.layout.rowlayout, data); // add 'data'
    this.context = c;
    this.feedList = data;
}

これにより、すべてが正しく機能します。

于 2013-01-28T20:30:11.120 に答える
1

adapter.notifyDataSetChanged()

AsyncResponseHandler.onPostExecute() の最後に役立ちます。そうでない場合 - アダプターのデータを保持する ArrayList が空かどうかを確認します。

于 2013-01-28T20:29:20.660 に答える