ViewStub и ListViews - Как правильно обрабатывать повторное использование представления
У меня есть ListView, определенный следующим образом:
<ListView
android:id="@+id/my_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</ListView>
ListView заполняется множеством строк элементов, определенных следующим образом:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:padding="8dp"
android:orientation="horizontal"
>
<ImageView
android:id="@+id/picture"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingLeft="8dp"
android:minHeight="48dp"
android:textColor="@color/black"
android:textSize="16sp" />
</LinearLayout>
<ViewStub
android:id="@+id/controls_stub"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout="@layout/quick_actions"
android:minHeight="48dp" />
</LinearLayout>
Теперь это представление списка заполняется с помощью пользовательского адаптера, который использует два массива строк для заполнения необходимых данных. Я хотел бы, чтобы небольшой ряд кнопок надувался, когда пользователь нажимает на элемент списка, но, конечно, только под этой конкретной строкой, вот код, который я использовал, чтобы сделать это:
private View.OnClickListener myCustomListener = new OnClickListener() {
@Override
public void onClick(View v) {
if (stub == null) {
//get the reference to it
stub = (ViewStub) v.findViewById(R.id.controls_stub);
}
if (stub.getVisibility() != View.VISIBLE) {
//inflate and make visible if not already
stub.setVisibility(View.VISIBLE);
}
else if (stub.getVisibility() == View.VISIBLE) {
//if visible, then toggle visibility back to gone
stub.setVisibility(View.GONE);
}
}
};
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHoldermHolder;
if (row == null) {
row = mInflater.inflate(R.layout.list_item, null);
mHolder = new ViewHolder();
mHolder.mName = (TextView) row.findViewById(android.R.id.text1);
mHolder.mPicture = (ImageView) row.findViewById(R.id.friends_picture);
row.setTag(mHolder);
}
else {
mHolder = (FriendListViewHolder) row.getTag();
}
mHolder.mName.setText(names[position]);
FacebookHelper.setProfileImage(row.getContext(), mIds[position], mHolder.mPicture);
row.setOnClickListener(myCustomListener);
return row;
}
Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку я раздуваю заглушку для этой строки, в каждой определенной строке (10 в моем случае Gnexus) есть одна с выделенными элементами - когда она должна быть только одна. Например, если имеется 40 элементов списка, в строке 1, 10 и 40 заглушка будет раздуваться, когда пользователь только нажал на элемент один.
Как бы я показал это только для указанной строки, и не повлиять ли это на дальнейшие представления, когда он повторно использует ту же строку?