android android-recyclerview recycler-adapter

android - Vista de reciclaje que infla diferentes filas:-Obteniendo una excepción al vincular los datos



android-recyclerview recycler-adapter (2)


Estoy trabajando en el Recyceview con diferentes elementos de inflación. Cuando NO estoy vinculando los datos en el método RecycleView de RecycleView no se RecycleView .
Pero cuando estoy vinculando los datos dentro de onBindViewHolder que onBindViewHolder la Exception , compruebe mi código y avíseme dónde estoy haciendo mal.

package com.tv.practise.adapter; /** Created by Ravindra Kushwaha on 10/10/16. */ public class RecycleDataAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context mContext; private ArrayList<RecycleBen> data; public static class SimpleText extends RecyclerView.ViewHolder { TextView first_data_tv; public SimpleText(View v) { super(v); this.first_data_tv = (TextView) v.findViewById(R.id.first_data_tv); } } public class SimpleImage extends RecyclerView.ViewHolder { ImageView second_data_iv; public SimpleImage(View v) { super(v); this.second_data_iv = (ImageView) v.findViewById(R.id.second_data_iv); } } public class SimpleImageWithText extends RecyclerView.ViewHolder { TextView third_data_tv; ImageView third_iv; public SimpleImageWithText(View v) { super(v); this.third_data_tv = (TextView) v.findViewById(R.id.third_data_tv); this.third_iv = (ImageView) v.findViewById(R.id.third_iv); } } public RecycleDataAdapter(Context mContext, ArrayList<RecycleBen> data) { this.mContext = mContext; this.data = data; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { int listViewItemType = getItemViewType(viewType); View itemView; if(listViewItemType==1) { itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recycle_first_item, parent, false); return new SimpleText(itemView ); } else if(listViewItemType==2) { itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recycle_fsecond_item, parent, false); return new SimpleImage(itemView); } else { itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recycle_third_item, parent, false); return new SimpleImageWithText(itemView); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { RecycleBen bean = data.get(position); if(holder.getItemViewType()==1) { /////HERE I AM GETTING THE EXCEPTION WHILE BINDIND DATA ((SimpleText)holder).first_data_tv.setText(bean.getName()); } else if(holder.getItemViewType()==2) { } else { /////HERE I AM GETTING THE EXCEPTION WHILE BINDIND DATA((SimpleImageWithText)holder).third_data_tv.setText(bean.getName()); } } @Override public int getItemViewType(int position) { return Integer.parseInt(data.get(position).getType_row()); } @Override public int getItemCount() { return data.size(); } }

Excepción mientras estoy vinculando los datos son los siguientes: -

3758-3758/com.tv.practise E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.tv.practise, PID: 3758 java.lang.ClassCastException: com.tv.practise.adapter.RecycleDataAdapter$SimpleImageWithText cannot be cast to com.tv.practise.adapter.RecycleDataAdapter$SimpleText at com.tv.practise.adapter.RecycleDataAdapter.onBindViewHolder(RecycleDataAdapter.java:101) at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5471) at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5504) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4741) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617) at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994) at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353) at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574) at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028) at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2625) at android.view.View.measure(View.java:18804) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5954) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) at android.view.View.measure(View.java:18804) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5954) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at android.view.View.measure(View.java:18804) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5954) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) at android.view.View.measure(View.java:18804) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5954) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643) at android.view.View.measure(View.java:18804) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2112) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1228) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1464) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1119) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6060) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) at android.view.Choreographer.doCallbacks(Choreographer.java:670) at android.view.Choreographer.doFrame(Choreographer.java:606) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) at android.os.Handler.handleCallback(Handler.java:746) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5443) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)


El motivo es onCreateViewHolder(ViewGroup parent, int viewType) . El parámetro es el tipo de vista pero no la posición. Usar int listViewItemType = getItemViewType(viewType) es incorrecto porque la position debe pasarse a getItemViewType .

En resumen, debe usar viewType directamente y eliminar listViewItemType en onCreateViewHolder .


@Joshua acortó mi problema ...
Para los otros usuarios que estoy publicando aquí, está el código para inflar las diferentes filas (3 filas) en RecycleView
Y funciona bien, verifique las siguientes líneas del código: - Estoy publicando mi código completo aquí, por favor verifique: -

Aquí RecyleClass.java es mi clase principal

package com.tv.practise.recycleview; import android.app.Activity; import android.os.Bundle; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import com.tv.practise.R; import java.util.ArrayList; /** * Created by Ravindra Kushwaha on 10/10/16. */ public class RecyleClass extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.recycle_main); RecyclerView recycler_vw = (RecyclerView)findViewById(R.id.recycler_vw); ArrayList<RecycleBen> arrayList = new ArrayList<>(); for (int i = 0;i<=25;i++) { RecycleBen bean = new RecycleBen(); if(i%2==0) { bean.setType_row("1"); bean.setName("First element"); bean.setImage_url("http://www.androhub.com/wp-content/uploads/2015/09/staggeredrecyclerview_banner.jpg"); } else if(i%3==0) { bean.setType_row("2"); bean.setName("Second element"); bean.setImage_url("http://i.stack.imgur.com/snB84.png"); } else { bean.setType_row("3"); bean.setName("Third element"); bean.setImage_url("http://inducesmile.com/wp-content/uploads/2015/05/gridbanner.jpg"); } arrayList.add(bean); } RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this); recycler_vw.setLayoutManager(mLayoutManager); recycler_vw.setItemAnimator(new DefaultItemAnimator()); recycler_vw.setAdapter(new RecycleDataAdapter(this, arrayList)); } }

Aquí está mi layout para RecyleClass.java que es recycle_main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_vw" android:layout_width="match_parent" android:layout_height="wrap_content" android:clipToPadding="false" /> </LinearLayout>

Entrada de graduados para la vista de Recycleview con CardView y Glide

// CardView compile ''com.android.support:cardview-v7:23.4.0'' // RecyclerView compile ''com.android.support:recyclerview-v7:23.4.0'' // For the glide libraray compile ''com.github.bumptech.glide:glide:3.7.0''

Y a continuación está mi clase getter y setter que es RecycleBen.java

package com.tv.practise.recycleview; /** * Created by Ravindra Kushwaha on 10/10/16. */ public class RecycleBen { private String type_row; private String name; private String image_url; public String getType_row() { return type_row; } public void setType_row(String type_row) { this.type_row = type_row; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getImage_url() { return image_url; } public void setImage_url(String image_url) { this.image_url = image_url; } }

Y por último mi clase de Adaptador que es RecycleDataAdapter.java

package com.tv.practise.adapter; /** * Created by Ravindra Kushwaha on 10/10/16. */ public class RecycleDataAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context mContext; private ArrayList<RecycleBen> data; public class SimpleText extends RecyclerView.ViewHolder { TextView first_data_tv; public SimpleText(View v) { super(v); this.first_data_tv = (TextView) v.findViewById(R.id.first_data_tv); } } public class SimpleImage extends RecyclerView.ViewHolder { ImageView second_data_iv; ProgressBar second_pb; public SimpleImage(View v) { super(v); this.second_data_iv = (ImageView) v.findViewById(R.id.second_data_iv); this.second_pb = (ProgressBar)v.findViewById(R.id.second_pb); } } public class SimpleImageWithText extends RecyclerView.ViewHolder { TextView third_data_tv; ImageView third_iv; ProgressBar third_pb; public SimpleImageWithText(View v) { super(v); this.third_data_tv = (TextView) v.findViewById(R.id.third_data_tv); this.third_iv = (ImageView) v.findViewById(R.id.third_iv); this.third_pb = (ProgressBar)v.findViewById(R.id.third_pb); } } public RecycleDataAdapter(Context mContext, ArrayList<RecycleBen> data) { this.mContext = mContext; this.data = data; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView; if(viewType==1) { itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recycle_first_item, parent, false); return new SimpleText(itemView ); } else if(viewType==2) { itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recycle_fsecond_item, parent, false); return new SimpleImage(itemView); } else { itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recycle_third_item, parent, false); return new SimpleImageWithText(itemView); } } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { RecycleBen bean = data.get(position); if(holder.getItemViewType()==1) { ((SimpleText)holder).first_data_tv.setText(bean.getName()); } else if(holder.getItemViewType()==2) { final SimpleImage simple_holder = (SimpleImage)holder; simple_holder.second_pb.setVisibility(View.VISIBLE); Glide.with(mContext) .load(bean.getImage_url()) .fitCenter() .crossFade() .listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { if (e instanceof UnknownHostException) simple_holder.second_pb.setVisibility(View.VISIBLE); return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { simple_holder.second_pb.setVisibility(View.GONE); simple_holder.second_data_iv.setVisibility(View.VISIBLE); return false; } }).into(simple_holder.second_data_iv);; } else { final SimpleImageWithText third_holder = (SimpleImageWithText)holder; third_holder.third_data_tv.setText(bean.getName()); third_holder.third_pb.setVisibility(View.VISIBLE); Glide.with(mContext) .load(bean.getImage_url()) .fitCenter() .crossFade() .listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { if (e instanceof UnknownHostException) third_holder.third_pb.setVisibility(View.VISIBLE); return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { third_holder.third_pb.setVisibility(View.GONE); third_holder.third_iv.setVisibility(View.VISIBLE); return false; } }).into(third_holder.third_iv);; } } @Override public int getItemViewType(int position) { return Integer.parseInt(data.get(position).getType_row()); } @Override public int getItemCount() { return data.size(); } }

Como estamos inflando las diferentes filas en la vista de Recycleview , utilizamos aquí 3 recycle_first_item.xml que son como recycle_first_item.xml , recycle_fsecond_item.xml y el último recycle_third_item.xml
Uno por uno, estoy mostrando todos los diseños xml , que son los siguientes:

recycle_first_item.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="100dp" android:layout_gravity="center" android:layout_margin="5dp" card_view:cardCornerRadius="4dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center"> <TextView android:id="@+id/first_data_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/black" android:textSize="25sp" android:text="Hello Card" /> </LinearLayout>

recycle_fsecond_item.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="150dp" android:layout_gravity="center" android:layout_margin="5dp" card_view:cardCornerRadius="4dp"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <ProgressBar android:id="@+id/second_pb" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" /> <ImageView android:id="@+id/second_data_iv" android:layout_width="match_parent" android:layout_height="120dp" android:textColor="@android:color/black" android:layout_centerInParent="true" android:visibility="invisible" android:src="@drawable/bubble1" /> </RelativeLayout> </android.support.v7.widget.CardView>

recycle_third_item.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="150dp" android:layout_gravity="center" android:layout_margin="5dp" card_view:cardCornerRadius="4dp"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center"> <TextView android:id="@+id/third_data_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/black" android:textSize="25sp" android:layout_centerInParent="true" android:text="Hello Card" /> <ProgressBar android:id="@+id/third_pb" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerInParent="true" android:layout_below="@+id/third_data_tv" /> <ImageView android:id="@+id/third_iv" android:layout_width="match_parent" android:layout_below="@+id/third_data_tv" android:layout_height="150dp" android:src="@drawable/bubble2" android:layout_centerInParent="true" android:visibility="invisible" /> </RelativeLayout> </android.support.v7.widget.CardView>

Y finalmente el resultado es el siguiente: