2017-10-08 6 views
1

Je voudrais toujours afficher exactement dix lignes dans un RecyclerView. RecyclerView n'a pas de paramètre configurable pour cela. Une approche consiste à calculer la taille de chaque rangée. Je voudrais que la table occupe la moitié de l'écran et affiche toujours 0..10 éléments dans cette zone. Si plus de 10 éléments, l'utilisateur ferait défiler pour voir les éléments. À l'heure actuelle, le comportement par défaut de RecyclerView semble être de continuer à tout pousser à mesure qu'il se développe.Comment afficher exactement dix lignes dans RecyclerView

+0

utilisation de la bibliothèque puis – pskink

+0

@pskink de [radiomessagerie] (https://developer.android.com/topic/libraries/architecture/paging.html) Google Je suis d'accord cela devrait être utilisé. Savez-vous comment la taille des objets visibles est affichée? Je vois comment il récupère un nombre particulier mais ne sait pas comment la zone visible est déterminée – StevenAbroad

Répondre

0
@Override 
public int getItemCount() { 
    if(list.size()>10){ 
    return 10; 
}else{ 
return list.size(); 
} 
} 

À votre avis recycleur retour en classe adaptateur obtenir élément compter 10 si la taille d'un tableau ou d'une liste est supérieure à 10

+0

Y avez-vous utilisé Downvote? –

+0

Je ne l'ai pas downvote. Mais je voudrais toujours qu'ils soient en mesure de faire défiler pour voir 10-20. Peuvent-ils toujours faire cela?> – StevenAbroad

+0

Ajoutez la taille à votre constructeur dans l'adaptateur recycleur et lisez la taille. quand vous en voudrez plus, changez cette valeur et utilisez notifyDataSetChanged() lorsque l'utilisateur clique sur load more comme vous le voyez dans les applications de messagerie et de chat –

0

Votre supposition est juste, il travaille avec un calcul dynamique de la hauteur de ligne, voici un exemple:

simple debout classe pour les données que vous souhaitez afficher:

public class CustomItem { 

    private int counter; 

    public CustomItem(int counter) { 
     this.counter = counter; 
    } 

    public int getCounter() { 
     return counter; 
    } 

    public void setCounter(int counter) { 
     this.counter = counter; 
    } 
} 

et mise en page simple pour afficher CustomItem dans une liste:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:background="@android:color/darker_gray"> 

    <TextView 
     android:id="@+id/txvTest" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="8dp" 
     android:text="Test"/> 

</RelativeLayout> 

RecyclerAdapter pour cette classe, vous verrez que nous fixons méthode hauteur de ligne par programme dans onBindViewHolder:

public class CustomItemRecyclerAdapter extends RecyclerView.Adapter<CustomItemRecyclerAdapter.SimpleItemViewHolder> { 

    private static int NB_OF_ITEM_TO_DISPLAY = 10; 
    private List<CustomItem> customItems; 
    private Context context; 
    private int rowHeight; 

    public class SimpleItemViewHolder extends RecyclerView.ViewHolder { 

     TextView txvTest; 
     RelativeLayout container; 

     public SimpleItemViewHolder(View itemView) { 
      super(itemView); 

      txvTest = (TextView) itemView.findViewById(R.id.txvTest); 
      container = (RelativeLayout) itemView; 
     } 
    } 

    public CustomItemRecyclerAdapter(Context context, List<CustomItem> customItems) { 
     this.context = context; 
     this.customItems = customItems; 
    } 

    public void setItemHeight(int parentHeightInPx){ 
     // Height of a row is just parent height divided by number of row to display 
     this.rowHeight = parentHeightInPx/CustomItemRecyclerAdapter.NB_OF_ITEM_TO_DISPLAY; 
     // Notify adapter because items will need to be redraw to use newly set height 
     this.notifyDataSetChanged(); 
    } 

    @Override 
    public SimpleItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(context).inflate(R.layout.custom_item, parent, false); 
     return new SimpleItemViewHolder(itemView); 

    } 

    @Override 
    public void onBindViewHolder(SimpleItemViewHolder holder, int position) { 
     CustomItem item = customItems.get(position); 

     holder.txvTest.setText("Item " + item.getCounter()); 
     holder.txvTest.setBackgroundColor(item.getCounter()); 

     // Row size magic is here! 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, rowHeight); 
     holder.container.setLayoutParams(params); 
    } 

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

} 

mise en page d'activité, à la fois un TextView utilisé comme espace réservé pour la moitié de l'écran et le RecyclerView:

<?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="match_parent" 
       android:orientation="vertical"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:background="@color/colorAccent" 
     android:text="TEST"/> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/a_main_rcv_items" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@color/colorPrimary" 
     android:layout_weight="1" 
     android:scrollbars="vertical"/> 

</LinearLayout> 

Et Activity code avec des commentaires pour comprendre comment cela fonctionne;):

public class MainActivity extends AppCompatActivity { 

    private RecyclerView recyclerView; 
    private CustomItemRecyclerAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Link to layout recycler view 
     recyclerView = (RecyclerView) findViewById(R.id.a_main_rcv_items); 

     // Create a simple linear layout manager and set it to recyclerview 
     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 

     // Create an instance of our custom Adapter 
     adapter = new CustomItemRecyclerAdapter(MainActivity.this, generateItems(20)); 
     // Set this adapter 
     recyclerView.setAdapter(adapter); 

     // Listen for recycler view layout change event to get its height and then compute and set new rows height 
     recyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
      @Override 
      public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
       // Set item height using height of recyclerView 
       adapter.setItemHeight(view.getHeight()); 
       // Need to simulate a scroll to force a redraw of recycler rows with new height... I have not find better for now... 
       recyclerView.scrollBy(0,1); 
      } 
     }); 
    } 

    private List<CustomItem> generateItems(int nb) { 
     ArrayList<CustomItem> items = new ArrayList<>(nb); 
     for (int i = 1; i < nb + 1; i++) { 
      items.add(new CustomItem(i)); 
     } 
     return items; 
    } 
}