1

ListView を使用して、一部の行で TextViews を表示し、他の行では表示しません。アイテムがいくつあるかわかりませんが、問題なく動作しますが、下にスクロールすると表示が変わりました。

例: ListView に 10 個のアイテムがあり、そのうちの 5 つだけが現在表示されているとします。アダプターは 0 から 4 までの位置を正しく返します...問題ありません。アイテム 10 の位置を下にスクロールして一番上に戻ると、すべてのアイテムがリストの最初のアイテムのように表示されます。何度もスクロールすると、最初のアイテムが 10 回繰り返されます。

私はArrayAdapterを使用しています。
ここにいくつかのコードがあります:

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        PlanningHolder holder = null;
        if (row == null) {
            row = mInflater.inflate(layoutResourceId, parent, false);

            holder = new PlanningHolder();
            holder.numberOfJour = (TextView) row.findViewById(R.id.numberDate);
            holder.lay = (LinearLayout) row.findViewById(R.id.layPlage);

            row.setTag(holder);
        } else {
            holder = (PlanningHolder) row.getTag();
        }

        if(position%2 == 1){
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

            params.setMargins(50, 5, 30, 5);
            //MarginLayoutParams marginLayoutParams = (MarginLayoutParams) params.getLayoutParams();

            //marginLayoutParams.setMargins(marginleft, 5, display.getWidth() - marginright, 5);
            TextView newplage = new TextView(context);
            newplage.setLayoutParams(params);
            newplage.setBackgroundColor(context.getResources().getColor(R.color.darkorrange));

            holder.lay.addView(newplage);
        }

        holder.numberOfJour.setText(myPlannig.getCurrent().get(Calendar.DAY_OF_MONTH) + "");

        row.setId(position);
        return row;
    }

これは私のlistView宣言です:

<ListView
    android:id="@+id/list_planning"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:background="@drawable/top_shadow"
    android:scrollingCache="true"
    android:dividerHeight="1dp">
</ListView>
4

3 に答える 3

3

この問題は、再利用によって引き起こされconvertViewます。誤った最適化を無効にする

View row = null;

または、この場合に適切に、elsebranch ofifおよび set rowviewsを実装して最適化を修復します。numberDatelayPlage

ビューを追加していますが、ビューをholder.lay削除していないことに注意してください。スクロールして再利用すると蓄積されますconvertView

于 2013-07-16T10:25:07.597 に答える
2

これは、リスト ビューでは一般的なケースです。if と else のケースを正しく処理する必要があります。

たとえば、テキストを if ケースで設定し、else ケースでは設定しない場合、古い値が保持されます。リスト ビューのビューがリサイクルされています。

リスト ビューを最初に開くと、リスト ビューが作成されます。

前後にスクロールすると、すでに値を持っている既存のビューにデータをロードしています。

内の if ケースで処理するものは何でも、getViewおそらくelse で元に戻す必要があります。つまり、getViewメソッド内のコード フローのすべてのケースまたはパスでビューを処理する必要があります。

于 2013-07-16T10:35:19.720 に答える
0

このようにelse条件を入れます

else
{
lay.addView(newplage);
}
于 2016-04-14T09:04:51.263 に答える