2016-10-07 4 views
0

У меня есть Recyclerview с элементами, у которых есть скрытое дополнительное описание.Xamarin RecyclerView с кнопкой на товар другие товары нажаты

Я положил кнопку, чтобы показать или скрыть дополнительное описание.

Это работает нормально, но проблема в том, что если я нажимаю первый элемент, когда я прокручиваю, я вижу, что некоторые другие предметы также отображаются (например, если я нажимаю первый, он также показывает 7, 10, 17 и 20).

Когда я прокручиваю назад, обнаруженный предмет снова спрятан, это меня не беспокоит, но он дает любую информацию.

Это код адаптера

class ArticulosAdapter : RecyclerView.Adapter 
{ 
    // Event handler for item clicks: 
    public event EventHandler<int> ItemClick; 

    // Underlying data set 
    public List<Articulo> listado; 


    public ArticulosAdapter(List<Articulo> listadoArticulos) 
    { 
     listado = listadoArticulos; 
    } 

    // Create a new CardView (invoked by the layout manager): 
    public override ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) 
    { 
     // Inflate the CardView for the photo: 
     View itemView = LayoutInflater.From(parent.Context). 
        Inflate(Resource.Layout.filaArticulo, parent, false); 

     // Create a ViewHolder to find and hold these view references, and 
     ArticuloViewHolder vh = new ArticuloViewHolder(itemView,OnClick); 
     vh.Arrow.Click += (o, e) => 
     { 
      if (vh.Info.Visibility == ViewStates.Gone) 
       vh.Info.Visibility = ViewStates.Visible; 
      else 
       vh.Info.Visibility = ViewStates.Gone; 
     }; 
     return vh; 
    } 

    // Fill in the contents 
    public override void OnBindViewHolder(ViewHolder holder, int position) 
    { 
     ArticuloViewHolder vh = holder as ArticuloViewHolder; 
     if (listado[position].imagen != null) 
      vh.Image.SetImageBitmap(listado[position].BitImage); 
     vh.Caption.Text = listado[position].nombre; 
     vh.Cantidad.Text = "DISPONIBLE :" + listado[position].cantidad; 


    } 
    void OnClick(int position) 
    { 
     if (ItemClick != null) 
      ItemClick(this, position); 
    } 

    // Return the number of photos available in the photo album: 
    public override int ItemCount 
    { 
     get { return listado.Count; } 
    } 

    public class ArticuloViewHolder : ViewHolder 
    { 
     public ImageView Image { get; private set; } 
     public TextView Caption { get; private set; } 
     public TextView Cantidad { get; private set; } 
     public LinearLayout Info { get; private set; } 
     public ImageButton Arrow { get; private set; } 

     // Get references to the views defined in the CardView layout. 
     public ArticuloViewHolder(View itemView, Action<int> listener) 
      : base(itemView) 
     { 
      Image = itemView.FindViewById<ImageView>(Resource.Id.foto); 
      Caption = itemView.FindViewById<TextView>(Resource.Id.nombre); 
      Cantidad = itemView.FindViewById<TextView>(Resource.Id.cantidad); 
      Arrow = itemView.FindViewById<ImageButton>(Resource.Id.arrowButt); 
      Info = itemView.FindViewById<LinearLayout>(Resource.Id.infoLay); 
      itemView.Click += (sender, e) => listener(base.Position); 
     } 
    } 
} 

И это код строки

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
<android.support.v7.widget.CardView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    card_view:cardElevation="4dp" 
    card_view:cardUseCompatPadding="true" 
    card_view:cardCornerRadius="5dp"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:padding="8dp"> 
     <ImageView 
      android:layout_width="150px" 
      android:layout_height="150px" 
      android:id="@+id/foto" 
      android:scaleType="centerCrop" 
      android:layout_gravity="center"/> 
     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:textColor="#333333" 
      android:text="Caption" 
      android:id="@+id/nombre" 
      android:layout_gravity="center_horizontal" 
      android:layout_marginLeft="4dp" /> 
    <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" 
      android:id="@+id/infoLay" 
      android:visibility="gone" 
      android:padding="8dp"> 
     <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:textAppearance="?android:attr/textAppearanceMedium" 
       android:textColor="#333333" 
       android:text="Caption" 
       android:id="@+id/cantidad" 
       android:layout_gravity="center_horizontal" 
       android:layout_marginLeft="4dp" /> 
     </LinearLayout> 

     <ImageButton 
      android:id="@+id/arrowButt" 
      android:layout_width="match_parent" 
      android:src="@drawable/down" 
      android:layout_height="50dp"/> 
     </LinearLayout> 
</android.support.v7.widget.CardView> 

ответ

1

другие показали элементы являются те, используя тот же (переработанный) держатель и виды просмотра. Вам необходимо (повторно) установить видимость части Info в OnBindViewHolder().

В вашем случае, как вы не возражаете, если элемент скрыт снова при прокрутке назад, вы можете просто сделать что-то вроде:

public override void OnBindViewHolder(ViewHolder holder, int position) 
{ 
    ... 

    vh.Info.Visibility = ViewStates.Gone 
} 
+0

Я чувствую себя немного стыдно это было «так просто» .. Спасибо.^_^U – Mulflar