0

アプリケーション用のRSSフィードリーダーを作成しようとしていますが、奇妙な問題があります。このフィードを実装するには、カスタマイズしたArrayListから入力したListViewを使用します。

ArrayListが表示したいすべてのフィールドでいっぱいであることは知っていますが(すべてのフィールドをLogcatに出力します)、アプリを実行すると、ListViewのすべてのセルが想定される情報で満たされるわけではありません。それらの大部分はTextViewを表示します。かなりランダムに見えますが、常に正しく機能するものが最初の要素です。他のものは時々そうします。

また、もう1つの奇妙な点は、要素内の情報を表示できない場合でも、OnItemClickListenerが完全に機能することです。

よろしくお願いします。

getViewコードを添付します。

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    AdapterWrapper wrapper;
    if (v == null) {
        LayoutInflater li = (LayoutInflater) this.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = li.inflate(R.layout.itemrow, null);
        wrapper = new AdapterWrapper(v, cont);
        v.setTag(wrapper);
    } else {
        wrapper = (AdapterWrapper) convertView.getTag();
        RssItem o = this.getItem(position);
        if (o != null)
            wrapper.populateFrom(o);
        parent.refreshDrawableState();
    }
    return v;
}
4

2 に答える 2

0

おそらく、でリサイクルされたビューケースを適切に処理していませんgetView

それを確認するときは、convertViewconvertView != nullに実際に情報を入力する必要があります。実際のビュー階層はそこにありますが、情報は別の行に関連付けられた古いリサイクルビューからのものになります。

getViewより具体的な情報については、コードを投稿してください。

編集-私はwrapper.populateFrom(o)あなたが持っているかどうかにかかわらずあなたが呼び出す必要があると思いますconvertView。その部分をifステートメントの外に移動してみてください。

 if (v == null) {
    LayoutInflater li = (LayoutInflater) this.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = li.inflate(R.layout.itemrow, null);
    wrapper = new AdapterWrapper(v, cont);
    v.setTag(wrapper);
 } else {
    wrapper = (AdapterWrapper) convertView.getTag();
 }
 RssItem o = this.getItem(position);
 if (o != null)
    wrapper.populateFrom(o);
 parent.refreshDrawableState(); // not sure what this is doing
于 2011-03-16T16:36:11.043 に答える
0

私はそれを機能させました、私は{の後にあるはずではなかった{を持っていました

そうしないと

つまり、コードは最終的に次のようになります。

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    AdapterWrapper wrapper;
    if (v == null) {
        LayoutInflater li = (LayoutInflater) this.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = li.inflate(R.layout.itemrow, null);
        wrapper = new AdapterWrapper(v, cont);
        v.setTag(wrapper);
    } else
        wrapper = (AdapterWrapper) convertView.getTag();

    RssItem o = this.getItem(position);
    if (o != null)
        wrapper.populateFrom(o);
    parent.refreshDrawableState();

    return v;
}
于 2011-03-16T16:47:22.467 に答える