8

カスタム リスト アダプターを備えた ListView があります。getView() メソッドでは、ListView14.java の API デモに示されているように、ViewHolder の「パターン」を使用しています。リストを最初にレンダリングすると、正しくロードされるようです。ただし、私が直面している問題は、リストをスクロールすると、リストのデータが間違った行に表示されることです (つまり、行 10 にあるはずの TextView が行 2 に表示されます)。 )。ただし、ビューホルダーを使用せず、代わりに毎回 findViewById() を呼び出すと、リスト ビューが正しくレンダリングされます。

4

3 に答える 3

10

ただし、私が直面している問題は、リストをスクロールすると、リストのデータが間違った行に表示されることです (つまり、行 10 にあるはずの TextView が行 2 に表示されます)。 )。

最も可能性が高いのは、行を不適切にリサイクルしてViewHoldersいるため、操作している行が、返されている行に適していないことです。

行の再利用について詳しく説明している私の本の 1つからの無料の抜粋を次に示します。

于 2010-07-08T23:52:55.807 に答える
1

ここで本当の問題を発見したと思います。各行のレイアウト パラメータをオンザフライで設定する場合は、すべての条件に対して設定する必要があります。私の問題は、それが最初の行の場合、レイアウトパラメーター(パディングやマージンなど)を設定しましたが、中間の行の場合、膨張したものを使用するだけだと考えて、これらのパラメーターを明示的に設定しなかったことですビューインフレータによって。これは、毎回ビューを膨らませたときに機能した理由を説明しています。ここに前後があります:

前:

if (position == 0) {

            layoutParams.topMargin = uiHelper.getDip(15.0f);
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,
                    RelativeLayout.TRUE);
            holder.actionMenu.setLayoutParams(layoutParams);

            holder.contentLayout.setBackgroundResource(R.drawable.top_row);

        } else if (position == posts.size() - 1) {
            holder.contentLayout
                    .setBackgroundResource(R.drawable.bottom_row);

            holder.contentLayout.setPadding(holder.contentLayout
                    .getPaddingLeft(),
                    holder.contentLayout.getPaddingTop(),
                    holder.contentLayout.getPaddingRight(),
                    holder.contentLayout.getPaddingBottom() +  uiHelper.getDip(10.0f));

        } else {
            holder.contentLayout
                    .setBackgroundResource(R.drawable.inner_row);
        }

後:`

            layoutParams.topMargin = uiHelper.getDip(10.0f);
        holder.contentLayout.setPadding(holder.contentLayout
                .getPaddingLeft(),
                holder.contentLayout.getPaddingTop(),
                holder.contentLayout.getPaddingRight(),
                uiHelper.getDip(10.0f));
        if (position == 0) {

            layoutParams.topMargin = uiHelper.getDip(15.0f);
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,
                    RelativeLayout.TRUE);

            holder.contentLayout.setBackgroundResource(R.drawable.top_row);

        } else if (position == posts.size() - 1) {
            holder.contentLayout
                    .setBackgroundResource(R.drawable.bottom_row);

            holder.contentLayout.setPadding(holder.contentLayout
                    .getPaddingLeft(),
                    holder.contentLayout.getPaddingTop(),
                    holder.contentLayout.getPaddingRight(),
                    uiHelper.getDip(20.0f));

        } else {

            holder.contentLayout
                    .setBackgroundResource(R.drawable.inner_row);

        }

        holder.actionMenu.setLayoutParams(layoutParams);
于 2010-07-09T14:08:48.280 に答える