0

list_item で非表示の線形レイアウトを非表示にすることで、リスト ビューの下部を下にスライドさせようとしています。問題は、ビューが LayoutAdapter で再利用されているように見えるため、変更が適用しようとしていたビューだけに影響しないことです。代わりに、ビューが再利用される場所に表示されます。ドロップダウンをリクエストしたビューのみにドロップダウンを制限するにはどうすればよいですか? ドロップダウンとは、線形レイアウトを再表示することを意味します。

4

1 に答える 1

0

リストには常に、ユーザーが見ることができる数のビューがあります。ユーザーがスクロールすると、ビューから外れたビューが再利用され、ユーザーがスクロールした新しいリスト データが表示されます。リスト項目が再描画されたときに、リスト項目の状態をリセットする必要があります。

リスト データを格納するオブジェクトにブール変数 'expanded' を追加します。(ArrayAdapter に追加するオブジェクト)。ユーザーが listItem で LinearLayout を展開する場合は、expanded = true を設定します。

public class MyListItem
{
  public boolean expanded = false;

  // data you are trying to display to the user goes here
  // ...
}

次に、リスト アダプタの getView メソッドでこれを行います。

public class MyListAdapter extends ArrayAdapter<MyListItem>
{
    public MyListAdapter (Context context, ArrayList<AudioPlaylist> objects)
    {
        super(context, R.layout.list_item, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        LinearLayout rowLayout;
        MyListItem item = this.getItem(position);

        if (convertView == null)
        {
            rowLayout = (LinearLayout) LayoutInflater.from(this.getContext()).inflate(R.layout.list_item, parent, false);
        }
        else
        {
            rowLayout = (LinearLayout) convertView;
        }

        //set the textviews, etc that you need to display the data with
        //...

        LinearLayout expanded = rowLayout.findViewById(R.id.expanded_area_id);

        if (item.expanded)
        {
           //show the expanded area
           expanded.setVisibility(View.VISIBLE);
        }
        else
        {
           //hide the area
           expanded.setVisibility(View.GONE);
        }           

        return rowLayout;
    }
}

list_item.xml にすべてをラップする LinearLayout があることを確認してください。そうしないと、キャスト例外が発生します。

それが役立つことを願っています...

于 2012-11-29T17:02:03.887 に答える