text_row.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="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/textViewText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:textAppearance="@android:style/TextAppearance.Large" android:text="Text" /> </RelativeLayout>
image_row.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/imageViewImage" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" app:srcCompat="@mipmap/iran" /> </RelativeLayout>
ViewHolderText.java
public class ViewHolderText extends RecyclerView.ViewHolder { public TextView textViewText; public ViewHolderText(View itemView) { super(itemView); textViewText= (TextView) itemView.findViewById(R.id.textViewText); } }
ViewHolderImage.java
public class ViewHolderImage extends RecyclerView.ViewHolder{ public ImageView imageViewImage; public ViewHolderImage(View itemView) { super(itemView); imageViewImage= (ImageView) itemView.findViewById(R.id.imageViewImage); } }
ObjectAdapter.java
public class ObjectAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private final int Text = 0, Image = 1; List<Object> objectList; public ObjectAdapter(List<Object> objectList) { this.objectList = objectList; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Context context = parent.getContext(); LayoutInflater inflater = LayoutInflater.from(context); RecyclerView.ViewHolder viewHolder = null; if (viewType == Text) { View view = inflater.inflate(R.layout.text_row, parent, false); viewHolder = new ViewHolderText(view); } else if (viewType == Image) { View view = inflater.inflate(R.layout.image_row, parent, false); viewHolder = new ViewHolderImage(view); } return viewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder.getItemViewType()==Text) { ViewHolderText viewHolder= (ViewHolderText) holder; com.example.mahmood.a087.Text obj= (com.example.mahmood.a087.Text) objectList.get(position); viewHolder.textViewText.setText(obj.getText()); } else if (holder.getItemViewType()==Image) { ViewHolderImage viewHolder= (ViewHolderImage) holder; com.example.mahmood.a087.Image obj= (com.example.mahmood.a087.Image) objectList.get(position); viewHolder.imageViewImage.setImageResource(obj.getImage()); } } @Override public int getItemViewType(int position) { if (objectList.get(position) instanceof Text) { return Text; } else if (objectList.get(position) instanceof Image) { return Image; } return -1; } @Override public int getItemCount() { return objectList.size(); } }
MainActivity.java
public class MainActivity extends AppCompatActivity { List<Object> objectList = new ArrayList<>(); private RecyclerView recyclerView; private RecyclerView.Adapter adapter; private RecyclerView.LayoutManager layoutManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Text text1 = new Text(); text1.setText("Mahmood"); Text text2 = new Text(); text2.setText("Javad"); Text text3 = new Text(); text3.setText("Hamed"); Image image1 = new Image(); image1.setImage(R.mipmap.iran); Image image2 = new Image(); image2.setImage(R.mipmap.canada); objectList.add(text1); objectList.add(image1); objectList.add(text2); objectList.add(text3); objectList.add(image2); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL); recyclerView.addItemDecoration(itemDecoration); recyclerView.setHasFixedSize(true); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); adapter = new ObjectAdapter(objectList); recyclerView.setAdapter(adapter); } }
References
https://github.com/mhdr/AndroidSamples/tree/master/087
https://guides.codepath.com/android/Heterogenous-Layouts-inside-RecyclerView