studio recyclerview recycler lista implement horizontal ejemplo cardview android android-layout android-recyclerview

android - lista - recyclerview adapter



¿Cómo construir un ListView horizontal con RecyclerView? (12)

¿Hay una mejor manera de implementar esto ahora con Recyclerview ahora?

Si.

Cuando utiliza un RecyclerView , debe especificar un LayoutManager que sea responsable de diseñar cada elemento en la vista. LinearLayoutManager permite especificar una orientación, tal como LinearLayout haría un LinearLayout normal.

Para crear una lista horizontal con RecyclerView , puede hacer algo como esto:

LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); RecyclerView myList = (RecyclerView) findViewById(R.id.my_recycler_view); myList.setLayoutManager(layoutManager);

Necesito implementar una vista de lista horizontal en mi aplicación de Android. Investigué un poco y encontré ¿Cómo puedo hacer un ListView horizontal en Android? y Horizontal ListView en Android? sin embargo, estas preguntas se hicieron antes de que se publicara Recyclerview. ¿Hay una mejor manera de implementar esto ahora con Recyclerview?


Es tanto para horizontal como para vertical.

RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test_recycler); recyclerView = (RecyclerView)findViewById(R.id.recyclerViewId); RecyclAdapter adapter = new RecyclAdapter(); //Vertical RecyclerView RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); recyclerView.setLayoutManager(mLayoutManager); //Horizontal RecyclerView //recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(),LinearLayoutManager.HORIZONTAL,false)); recyclerView.setAdapter(adapter); }


Ejemplo completo

La única diferencia real entre un RecyclerView vertical y uno horizontal es cómo configura LinearLayoutManager . Aquí está el fragmento de código. El ejemplo completo está abajo.

LinearLayoutManager horizontalLayoutManagaer = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false); recyclerView.setLayoutManager(horizontalLayoutManagaer);

Este ejemplo más completo sigue el modelo de mi respuesta vertical RecyclerView .

Actualizar dependencias de Gradle

Asegúrese de que las siguientes dependencias estén en el archivo gradle.build su aplicación:

implementation ''com.android.support:appcompat-v7:27.1.1'' implementation ''com.android.support:recyclerview-v7:27.1.1''

Puede actualizar los números de versión a lo que sea más actual .

Crear diseño de actividad

Agregue RecyclerView a su diseño xml.

activity_main.xml

<?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="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/rvAnimals" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout>

Crear diseño de elemento

Cada elemento de nuestro RecyclerView tendrá una vista única en color sobre un TextView . Cree un nuevo archivo de recursos de diseño.

recyclerview_item.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp"> <View android:id="@+id/colorView" android:layout_width="100dp" android:layout_height="100dp"/> <TextView android:id="@+id/tvAnimalName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp"/> </LinearLayout>

Crea el adaptador

RecyclerView necesita un adaptador para llenar las vistas en cada fila (elemento horizontal) con sus datos. Crea un nuevo archivo java.

MyRecyclerViewAdapter.java

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> { private List<Integer> mViewColors; private List<String> mAnimals; private LayoutInflater mInflater; private ItemClickListener mClickListener; // data is passed into the constructor MyRecyclerViewAdapter(Context context, List<Integer> colors, List<String> animals) { this.mInflater = LayoutInflater.from(context); this.mViewColors = colors; this.mAnimals = animals; } // inflates the row layout from xml when needed @Override @NonNull public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.recyclerview_item, parent, false); return new ViewHolder(view); } // binds the data to the view and textview in each row @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { int color = mViewColors.get(position); String animal = mAnimals.get(position); holder.myView.setBackgroundColor(color); holder.myTextView.setText(animal); } // total number of rows @Override public int getItemCount() { return mAnimals.size(); } // stores and recycles views as they are scrolled off screen public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { View myView; TextView myTextView; ViewHolder(View itemView) { super(itemView); myView = itemView.findViewById(R.id.colorView); myTextView = itemView.findViewById(R.id.tvAnimalName); itemView.setOnClickListener(this); } @Override public void onClick(View view) { if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition()); } } // convenience method for getting data at click position public String getItem(int id) { return mAnimals.get(id); } // allows clicks events to be caught public void setClickListener(ItemClickListener itemClickListener) { this.mClickListener = itemClickListener; } // parent activity will implement this method to respond to click events public interface ItemClickListener { void onItemClick(View view, int position); } }

Notas

  • Aunque no es estrictamente necesario, incluí la funcionalidad para escuchar eventos de clic en los elementos. Esto estaba disponible en los antiguos ListViews y es una necesidad común. Puede eliminar este código si no lo necesita.

Inicializar RecyclerView en actividad

Agregue el siguiente código a su actividad principal.

MainActivity.java

public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener { private MyRecyclerViewAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // data to populate the RecyclerView with ArrayList<Integer> viewColors = new ArrayList<>(); viewColors.add(Color.BLUE); viewColors.add(Color.YELLOW); viewColors.add(Color.MAGENTA); viewColors.add(Color.RED); viewColors.add(Color.BLACK); ArrayList<String> animalNames = new ArrayList<>(); animalNames.add("Horse"); animalNames.add("Cow"); animalNames.add("Camel"); animalNames.add("Sheep"); animalNames.add("Goat"); // set up the RecyclerView RecyclerView recyclerView = findViewById(R.id.rvAnimals); LinearLayoutManager horizontalLayoutManager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false); recyclerView.setLayoutManager(horizontalLayoutManager); adapter = new MyRecyclerViewAdapter(this, viewColors, animalNames); adapter.setClickListener(this); recyclerView.setAdapter(adapter); } @Override public void onItemClick(View view, int position) { Toast.makeText(this, "You clicked " + adapter.getItem(position) + " on item position " + position, Toast.LENGTH_SHORT).show(); } }

Notas

  • Observe que la actividad implementa el ItemClickListener que definimos en nuestro adaptador. Esto nos permite manejar eventos de clic de elemento en onItemClick .

Terminado

Eso es. Debería poder ejecutar su proyecto ahora y obtener algo similar a la imagen en la parte superior.

Notas


Con el lanzamiento de la biblioteca RecyclerView, ahora puede alinear fácilmente una lista de imágenes enlazadas con texto. Puede usar LinearLayoutManager para especificar la dirección en la que le gustaría orientar su lista, ya sea vertical u horizontal como se muestra a continuación.

Puedes descargar una demostración completa de esta publicación



Intentar construir un ListView horizontal lleva demasiado tiempo. Lo he resuelto de dos maneras.

1. Usando un ViewPager cuyo adaptador se extiende desde PagerAdapter.

2. Usando RecyclerView tal como se indica arriba. Necesita aplicar LayoutManager como en el siguiente código:

LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); RecyclerView myList = (RecyclerView) findViewById(R.id.my_recycler_view); myList.setLayoutManager(layoutManager);


Prueba esto:

myrecyclerview.setLayoutManager( new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL,false)); myrecyclerview.setAdapter(recyclerAdapter);

solo en caso de que tenga una vista de reciclador con algunos fragmentos.


Si desea utilizar la Vista horizontal del reciclador para actuar como ViewPager, ahora es posible con la ayuda de LinearSnapHelper que se agrega en la Biblioteca de soporte versión 24.2.0.

En primer lugar, agregue RecyclerView a su actividad / fragmento

<android.support.v7.widget.RecyclerView android:layout_below="@+id/sign_in_button" android:layout_width="match_parent" android:orientation="horizontal" android:id="@+id/blog_list" android:layout_height="match_parent"> </android.support.v7.widget.RecyclerView>

En mi caso, he usado un CardView dentro del RecyclerView

blog_row.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_margin="15dp" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <com.android.volley.toolbox.NetworkImageView android:id="@+id/imageBlogPost" android:layout_width="match_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:paddingBottom="15dp" android:src="@drawable/common_google_signin_btn_text_light_normal" /> <TextView android:id="@+id/TitleTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="20dp" android:text="Post Title Here" android:textSize="16sp" /> <TextView android:id="@+id/descriptionTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Post Description Here" android:paddingBottom="15dp" android:textSize="14sp" /> </LinearLayout> </android.support.v7.widget.CardView>

En tu actividad / fragmento

private RecyclerView mBlogList; LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); mBlogList = (RecyclerView) findViewById(R.id.blog_list); mBlogList.setHasFixedSize(true); mBlogList.setLayoutManager(layoutManager); LinearSnapHelper snapHelper = new LinearSnapHelper() { @Override public int findTargetSnapPosition(RecyclerView.LayoutManager lm, int velocityX, int velocityY) { View centerView = findSnapView(lm); if (centerView == null) return RecyclerView.NO_POSITION; int position = lm.getPosition(centerView); int targetPosition = -1; if (lm.canScrollHorizontally()) { if (velocityX < 0) { targetPosition = position - 1; } else { targetPosition = position + 1; } } if (lm.canScrollVertically()) { if (velocityY < 0) { targetPosition = position - 1; } else { targetPosition = position + 1; } } final int firstItem = 0; final int lastItem = lm.getItemCount() - 1; targetPosition = Math.min(lastItem, Math.max(targetPosition, firstItem)); return targetPosition; } }; snapHelper.attachToRecyclerView(mBlogList);

El último paso es configurar el adaptador a RecyclerView

mBlogList.setAdapter(firebaseRecyclerAdapter);


Si desea utilizar un RecyclerView con el GridLayoutManager , esta es la forma de lograr el desplazamiento horizontal.

recyclerView.setLayoutManager( new GridLayoutManager(recyclerView.getContext(), rows, GridLayoutManager.HORIZONTAL, false));


Vista del reciclador en dinámica horizontal.

Implementación de vista de reciclador

RecyclerView musicList = findViewById(R.id.MusicList); // RecyclerView musiclist = findViewById(R.id.MusicList1); // RecyclerView musicLIST = findViewById(R.id.MusicList2); LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); musicList.setLayoutManager(layoutManager); String[] names = {"RAP", "CH SHB", "Faheem", "Anum", "Shoaib", "Laiba", "Zoki", "Komal", "Sultan","Mansoob Gull"}; musicList.setAdapter(new ProgrammingAdapter(names));''

Clase de adaptador para la vista de reciclador, en la que hay un soporte de vista para mantener la vista de ese reciclador

public class ProgrammingAdapter extendsRecyclerView.Adapter<ProgrammingAdapter.programmingViewHolder> { private String[] data; public ProgrammingAdapter(String[] data) { this.data = data; } @Override public programmingViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); View view = inflater.inflate(R.layout.list_item_layout, parent, false); return new programmingViewHolder(view); } @Override public void onBindViewHolder(@NonNull programmingViewHolder holder, int position) { String title = data[position]; holder.textV.setText(title); } @Override public int getItemCount() { return data.length; } public class programmingViewHolder extends RecyclerView.ViewHolder{ ImageView img; TextView textV; public programmingViewHolder(View itemView) { super(itemView); img = itemView.findViewById(R.id.img); textV = itemView.findViewById(R.id.textt); } }


<HorizontalScrollView android:layout_width="match_parent" android:layout_height="wrap_content" > <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:scrollbars="vertical|horizontal" /> </HorizontalScrollView>


<android.support.v7.widget.RecyclerView android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layoutManager="android.support.v7.widget.LinearLayoutManager" />