Cómo crear una tarjeta CardView horizontal con RecyclerView con una sola tarjeta en la pantalla a la vez
Soy nuevo en Android Development. Estoy intentando exhibir una lista de tarjetas en la pantalla con solamente una tarjeta a la vez en la pantalla usando RecyclerView . Pero desafortunadamente las tarjetas que diseñé no están llenando el ancho de pantalla entero según lo esperado, como usted puede ver en la imagen dada abajo. ¿Cómo puedo estirar estas tarjetas para llenar toda la pantalla (en cuanto a la anchura, la altura es el contenido de envoltura). ¿Hay alguna solución posible a este problema?
Mi código:
- RecyclerView: Animar el cambio de tamaño del elemento
- Android 5.0 - Agregar cabecera / pie de página a un RecyclerView
- Android: Actualización de recyclerview con nuevos datos
- Disposición de Android: Recyclerview horizontal dentro de una Recyclerview vertical dentro de un Viewpager con comportamientos de desplazamiento
- Android: Control Desplazamiento suave sobre la vista del reciclador
activity_sub.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include android:id="@+id/appBar" layout="@layout/app_bar"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Horizontal Card List" android:textSize="16sp" android:padding="3dp" android:background="#CCCCCC" /> <android.support.v7.widget.RecyclerView android:id="@+id/hrlist_recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="horizontal" /> </LinearLayout>
custom_card.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="vertical" android:padding="8dp" android:tag="contains Cards main Container"> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:elevation="10dp" app:cardBackgroundColor="#B6B6B6"> <TextView android:id="@+id/card_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:padding="20dp" android:text="Card 1" android:textSize="30sp" /> </android.support.v7.widget.CardView> </LinearLayout>
SubActivity.java
package ab9.mamv.com.playground; import android.os.Bundle; import android.support.v4.app.NavUtils; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import java.util.ArrayList; import java.util.List; public class SubActivity extends ActionBarActivity { Toolbar toolbar; private RecyclerView mRecyclerView; private SubActivityAdapter mAdapter; private RecyclerView.LayoutManager mLayoutManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sub); toolbar = (Toolbar) findViewById(R.id.appBar); setSupportActionBar(toolbar); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); //RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.hrlist_recycler_view); mRecyclerView.setHasFixedSize(true); mAdapter = new SubActivityAdapter(this, getData()); mRecyclerView.setAdapter(mAdapter); //Layout manager for the Recycler View mLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); mRecyclerView.setLayoutManager(mLayoutManager); } public static List<SubActivityData> getData() { List<SubActivityData> subActivityData = new ArrayList<>(); String[] cardTitle = { "Card 1", "Card 2", "Card 3", "Card 4", "Card 5", "Card 6", }; for (int i = 0; i < cardTitle.length; i++) { SubActivityData current = new SubActivityData(); current.cardTitle = cardTitle[i]; subActivityData.add(current); } return subActivityData; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_sub, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } if (id == android.R.id.home) { NavUtils.navigateUpFromSameTask(this); } return super.onOptionsItemSelected(item); } }
SubActivityAdapter.java
package ab9.mamv.com.playground; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.Collections; import java.util.List; /** * Created by Abhishek on 20-03-2015. */ public class SubActivityAdapter extends RecyclerView.Adapter<SubActivityAdapter.SubActivityViewHolder> { private final LayoutInflater inflater; List<SubActivityData> subActivityData = Collections.EMPTY_LIST; public SubActivityAdapter(Context context, List<SubActivityData> subActivityData) { inflater = LayoutInflater.from(context); this.subActivityData = subActivityData; } @Override public SubActivityViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.custom_card, parent, false); SubActivityViewHolder subActivityViewHolder = new SubActivityViewHolder(view); return subActivityViewHolder; } @Override public void onBindViewHolder(SubActivityViewHolder holder, int position) { SubActivityData currentCard = subActivityData.get(position); holder.title.setText(currentCard.cardTitle); } @Override public int getItemCount() { return subActivityData.size(); } class SubActivityViewHolder extends RecyclerView.ViewHolder { TextView title; public SubActivityViewHolder(View itemView) { super(itemView); title = (TextView) itemView.findViewById(R.id.card_text); } } }
- Firebase RecyclerView - Desplácese sobre la animación cuando se añade un elemento nuevo
- Error: El hijo especificado ya tiene un padre. Debe llamar a removeView () en el padre del niño primero
- RecyclerView se bloquea al actualizar en la parte superior
- Deslizar un elemento a la vez
- Configuración de la aplicación: layout_behavior mediante programación
- Animación de RecyclerView en el clic de artículo
- ¿Cómo crear RecyclerView con múltiples tipos de vista?
- Mostrar datos SQLite en RecyclerView
Simplemente cambie su onCreateViewHolder a:
@Override public SubActivityViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.custom_card, parent, false); view.setMinimumWidth(parent.getMeasuredWidth()); SubActivityViewHolder subActivityViewHolder = new SubActivityViewHolder(view); return subActivityViewHolder; }
Puede que tenga que trabajar en custom_card.xml después de esto. Pero debería hacer el truco.
Aunque esta pregunta y muchas otras preguntas similares se publicaron hace mucho tiempo atrás, no encontré una sola solución de trabajo para ello.
Aquí hay una solución simple para ello
RecyclerView rv = (RecyclerView) findViewById(R.id.swipeView);; rv.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); if (dx >= 0) { recyclerView.smoothScrollToPosition(layoutManager.findLastVisibleItemPosition()); } else { recyclerView.smoothScrollToPosition(layoutManager.findFirstVisibleItemPosition()); } } });
Puede agregar umbral dx para swaps más atractivos.
Siga el tutorial a continuación, pero cambie su ancho y altura de CardView a "match_parent" y sólo obtendrá una tarjeta en la pantalla a la vez
- ¿Cómo se incluyen los encabezados http con MediaPlayer setDataSource?
- Conexión TLS de Android y certificado auto-firmado