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
Répondre
@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
Y avez-vous utilisé Downvote? –
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
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 –
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;
}
}
utilisation de la bibliothèque puis – pskink
@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