カスタム リスト アダプターを備えた ListView があります。getView() メソッドでは、ListView14.java の API デモに示されているように、ViewHolder の「パターン」を使用しています。リストを最初にレンダリングすると、正しくロードされるようです。ただし、私が直面している問題は、リストをスクロールすると、リストのデータが間違った行に表示されることです (つまり、行 10 にあるはずの TextView が行 2 に表示されます)。 )。ただし、ビューホルダーを使用せず、代わりに毎回 findViewById() を呼び出すと、リスト ビューが正しくレンダリングされます。
6684 次
3 に答える
10
ただし、私が直面している問題は、リストをスクロールすると、リストのデータが間違った行に表示されることです (つまり、行 10 にあるはずの TextView が行 2 に表示されます)。 )。
最も可能性が高いのは、行を不適切にリサイクルしてViewHolders
いるため、操作している行が、返されている行に適していないことです。
于 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 に答える