2017-09-18 3 views
1

Il s'agit d'une réponse postée dans une question qui consiste à répéter des vues de bouton dans certaines positions. Le code fonctionne bien. Mon doute est de savoir comment garder une visibilité sur le premier article même après avoir défilé dans recyclerview?Recycleur voir la réutilisabilité de view_holder. Comment maintenir la visibilité de l'élément de la position purticular?

class MyViewHolder extends RecyclerView.ViewHolder { 
     TextView message; 
     Button button; 
     public MyViewHolder(View itemView) { 
      super(itemView); 
      message = (TextView) itemView.findViewById(R.id.message); 
      button = (Button) itemView.findViewById(R.id.button); 
     } 
    } 

et le placer dans la méthode onBindViewHolder de votre adaptateur:

@Override 
public void onBindViewHolder(final MyViewHolder holder, int position) { 
    holder.button.setVisibility(View.GONE);   
    holder.message.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      holder.button.setVisibility(View.VISIBLE); 
     } 
    }); 
} 
+0

vous pouvez utiliser en-tête collant pour ce faire. vérifier ceci: (https://github.com/bgogetap/StickyHeaders) –

+0

J'ai eu ce dont vous avez besoin! Je suppose que vous devez comprendre l'explication donnée [ici] (https://stackoverflow.com/questions/32949971/how-can-i-make-sticky-headers-in-recyclerview-without-external-lib) –

Répondre

1

Je suppose que dans votre adaptateur, vous détenez un tableau d'objets qui représente les éléments que vous souhaitez afficher.

Ajoutez une propriété à cet objet nommée par exemple ButtonVisible et définissez la propriété lorsque vous appuyez sur le bouton.

L'adaptateur d'échantillon complet suit. Cela affiche une liste d'éléments avec un bouton qui, lorsqu'il est pressé, est rendu non visible. La visibilité est conservée quel que soit le nombre d'éléments de la liste ou le nombre de pages que vous faites défiler.

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.VH> { 

public static class MyData { 
    public boolean ButtonVisible = true; 
    public String Text; 

    public MyData(String text) { 
     Text = text; 
    } 
} 

public List<MyData> items = new ArrayList<>(); 

public TestAdapter() { 
    this.items.add(new MyData("Item 1")); 
    this.items.add(new MyData("Item 2")); 
    this.items.add(new MyData("Item 3")); 
} 

@Override 
public TestAdapter.VH onCreateViewHolder(ViewGroup parent, int viewType) { 
    return new VH((
      LayoutInflater.from(parent.getContext()) 
        .inflate(R.layout.test_layout, parent, false)) 
    ); 
} 

@Override 
public void onBindViewHolder(TestAdapter.VH holder, final int position) { 
    final MyData itm = items.get(position); 

    holder.button.setVisibility(itm.ButtonVisible ? View.VISIBLE : View.GONE); 
    holder.text.setText(itm.Text); 

    holder.button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      itm.ButtonVisible = false; 
      notifyItemChanged(position); 
     } 
    }); 

} 

@Override 
public int getItemCount() { 
    return items.size(); 
} 

public class VH extends RecyclerView.ViewHolder { 

    Button button; 
    TextView text; 

    public VH(View itemView) { 
     super(itemView); 
     button = itemView.findViewById(R.id.toggle); 
     text = itemView.findViewById(R.id.text1); 
    } 
} 
} 

test_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal"> 

    <Button 
     android:id="@+id/toggle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

    <TextView 
     android:id="@+id/text1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 
</LinearLayout> 
+0

Full Exemple: https://github.com/kuffs/RecyclerView-Demo – Kuffs

0

Définir un tableau de variables booléennes associées à chaque élément.

@Override 
public void onBindViewHolder(final MyViewHolder holder, int position) { 

    if(visibilityList.get(position)){ 
     holder.button.setVisibility(View.VISIBLE); 
    }else{ 
     holder.button.setVisibility(View.GONE); 
    } 

    holder.message.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(visibilityList.get(position)){ 
       visibilityList.set(position, false); 
       holder.button.setVisibility(View.GONE); 
      }else{ 
       visibilityList.set(position, true); 
       holder.button.setVisibility(View.VISIBLE); 
      } 

     } 
    }); 
} 

Note: visibilityList est la variable de la liste où chaque valeur est définie par défaut (true ou false selon vos besoins)

0

Utilisez HashMap pour maintenir les positions que vous devez montrer. Ecrire du code dans onBindViewHolder méthode

if(map.contains(holder.getAdapterPosition()){ 
    holder.btn.setVisibility(View.VISIBLE); 
} else { 
    holder.btn.setVisibility(View.GONE); 
} 

Note: - n'écrivent cas ailleurs aussi, recyclerView se conduisent mal par ailleurs dû réutilisabilité.