經常看到新聞之類的列表裏有好幾種不同的佈局樣式,很簡單,動手寫了一下,做個記錄。
效果圖如下:
主要思路:就是通過判斷接收的子項的佈局樣式的不同,來加載不同的佈局。
相應的Adapter適配器的代碼如下:
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context mContext; private List<Integer> typeList; private static final int ITEM_TYPE_ONE = 1; private static final int ITEM_TYPE_TWO = 2; private static final int ITEM_TYPE_THREE = 3; public MyRecyclerViewAdapter(Context mContext, List<Integer> typeList) { this.mContext = mContext; this.typeList = typeList; } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { if (viewType == ITEM_TYPE_ONE) { View convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_item_rview_type_one, parent, false); ViewHolderOne viewHolderOne = new ViewHolderOne(convertView); return viewHolderOne; } else if (viewType == ITEM_TYPE_TWO) { View convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_item_rview_type_two, parent, false); ViewHolderTwo viewHolderTwo = new ViewHolderTwo(convertView); return viewHolderTwo; } else if (viewType == ITEM_TYPE_THREE) { View convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_item_rview_type_three, parent, false); ViewHolderThree viewHolderThree = new ViewHolderThree(convertView); return viewHolderThree; } return null; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (holder instanceof ViewHolderOne) { bindViewHolderOne((ViewHolderOne) holder); } else if (holder instanceof ViewHolderTwo) { bindViewHolderTwo((ViewHolderTwo) holder, position); } else if (holder instanceof ViewHolderThree) { bindViewHolderThree((ViewHolderThree) holder); } } @Override public int getItemCount() { return typeList.size(); } @Override public int getItemViewType(int position) { if (typeList.get(position) == 1) { return ITEM_TYPE_ONE; } else if (typeList.get(position) == 2) { return ITEM_TYPE_TWO; } else if (typeList.get(position) == 3) { return ITEM_TYPE_THREE; } return 0; } static class ViewHolderOne extends RecyclerView.ViewHolder { private TextView tvTitle, tvContent; public ViewHolderOne(@NonNull View itemView) { super(itemView); tvTitle = itemView.findViewById(R.id.Layout_Item_RView_TypeOne_tvTitle); tvContent = itemView.findViewById(R.id.Layout_Item_RView_TypeOne_tvContent); } } static class ViewHolderTwo extends RecyclerView.ViewHolder { private TextView tvTitle; private GridView gViewPhoto; public ViewHolderTwo(@NonNull View itemView) { super(itemView); tvTitle = itemView.findViewById(R.id.Layout_Item_RView_TypeTwo_tvTitle); gViewPhoto = itemView.findViewById(R.id.Layout_Item_RView_TypeTwo_gViewPhoto); } } static class ViewHolderThree extends RecyclerView.ViewHolder { private TextView tvTitle; private ImageView ivThumb; public ViewHolderThree(@NonNull View itemView) { super(itemView); tvTitle = itemView.findViewById(R.id.Layout_Item_RView_TypeThree_tvTitle); ivThumb = itemView.findViewById(R.id.Layout_Item_RView_TypeThree_ivThumb); } } private void bindViewHolderOne(ViewHolderOne viewHolderOne) { viewHolderOne.tvTitle.setText("這是一條新聞的標題"); viewHolderOne.tvContent.setText("新聞內容新聞內容新聞內容新聞內容新聞內容新聞內容新聞內容新聞內容新聞內容新聞內容"); } private void bindViewHolderTwo(ViewHolderTwo viewHolderTwo, int position) { viewHolderTwo.tvTitle.setText("這是一條帶有多張圖片的新聞的標題"); List<Integer> photoList = new ArrayList<>(); for (int i = 0; i < 3; i ++) { photoList.add(R.drawable.fengjing); } PhotoListAdapter photoListAdapter = new PhotoListAdapter(mContext, photoList); viewHolderTwo.gViewPhoto.setAdapter(photoListAdapter); viewHolderTwo.gViewPhoto.setTag(position); viewHolderTwo.gViewPhoto.setOnItemClickListener((parent, view, position1, id) -> { int mPosition = (int) (parent.getTag()); Log.e("圖片索引", mPosition + "-" + position1); }); } private void bindViewHolderThree(ViewHolderThree viewHolderThree) { viewHolderThree.tvTitle.setText("這是一條帶有單張圖片新聞的標題"); } }