1

私は ListView ベースのアプリに取り組んでいますが、非常に奇妙な問題があります。ListItems が再表示され、正しいアイテムが正しい場所に表示されません。これを理解しやすくするために、各 ListItem のテキストをその位置と同じになるように設定しました。私はアダプターの getView() 呼び出しでこれを行っています。Nexus 7 4 を持っている場合、ListItems が表示されます。合計 10 個の ListItems がある場合、0、1、3、4、0、1、2、3、4 のようになります。これはすべてのデバイスに適用され、最初に画面に表示されるアイテムの数 + 1 が正しいことを意味します。他のすべての ListItems は再配置されます。

私のコードのどの部分に問題があると思いますか?なぜなら、今私は何時間もこれを修正しようとしてきましたが、私は無知だからです. すべてのヘルプは非常に高く評価されています。

編集:

ここに私の getView() があります:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    CountdownItem ci = mTitle.get(position);

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, parent, false);

        holder = new CountdownViewHolder();
        holder.mTitle = (TextView) convertView.findViewById(R.id.textPrim);
        holder.mSubtitle = (TextView) convertView
                .findViewById(R.id.textSec);
        holder.mDayProgress = (ProgressBar) convertView
                .findViewById(R.id.day_progress);
        holder.mMonthProgress = (ProgressBar) convertView
                .findViewById(R.id.month_progress);
        holder.mYearText = (TextView) convertView
                .findViewById(R.id.year_text);
        holder.day_help = (TextView) convertView
                .findViewById(R.id.day_help);
        holder.month_help = (TextView) convertView
                .findViewById(R.id.month_help);

        holder.setTitle(Integer.toString(position) + " Title");
        holder.setSubtitle(ci.getSubtitle());
        holder.fixImageAndText(position);

        convertView.setTag(holder);
    } else {
        holder = (CountdownViewHolder) convertView.getTag();
    }

    return convertView;
}
4

3 に答える 3

1

ViewHolder パターンを正しく使用していません。if/else次のコードは、節の外で の前に移動する必要がありますreturn convertView

   holder.setTitle(Integer.toString(position) + " Title");
   holder.setSubtitle(ci.getSubtitle());
   holder.fixImageAndText(position);
于 2013-02-03T15:08:26.703 に答える
1

これは、セルを再利用している場合のリストビューの正しい動作です。問題は、セルが最初に作成されたときにのみ値を設定することです。

convertView == null の場合、リストビューにはリサイクルするセルがありません。ただし、いくつか作成すると、それらを再利用してスクロール時に表示できます。

convertView が null でない場合でも、タイトルとサブタイトルを設定する必要があります。そうすれば、新しいリストの位置ごとにそれらを設定できます。

于 2013-02-03T15:11:07.923 に答える
1

はい、これは、パフォーマンスとレンダリング速度を向上させるために、Android がリスト内のビューを再利用するためです。

ホルダー パターンは、ビュー ID を格納するために使用されます。それらを取得したら、内部に表示するテキストを設定する必要があります。

たとえば、データ (例: myDataArray[position]) を取得し、問題がなければ、TextView のsetText().

于 2013-02-03T15:05:04.113 に答える