RecyclerView加载不同的Layout

这篇博客介绍了如何在Android的RecyclerView中实现加载两种不同布局的方法。主要内容包括解析xml文件、定义一个接口并让不同实体类实现、创建自定义适配器以及在主活动中设置数据和添加布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候一个界面的RecyclerView可能要显示好几种的不同的布局,学习了,记录一下
下面是同一个RecyclerView加载两种不同布局的写法

主要加载的xml文件

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </android.support.v7.widget.RecyclerView>

</LinearLayout>

RecyclerView中加载的第一种布局xml:top.xml
只显示一个TextView

<?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="wrap_content">
    
    <TextView
        android:id="@+id/top_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

RecyclerView中加载的第二种xml:Container.xml
显示一个ImageView和一个TextView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="50dp">

    <ImageView
        android:id="@+id/container_image"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight="1"/>
    <TextView
        android:id="@+id/container_title"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight="1"/>
</LinearLayout>

创建一个接口,并让两个实体类实现它

接口Type.java

package com.example.mulrecyclerview;

public interface Type {
    int getItemType();
}

第一个布局的实体类Condition.java

package com.example.mulrecyclerview;

public class Condition implements Type{
    private String title;

    public Condition(String title) {
        this.title = title;
    }

    public String getTitle() {
        return title;
    }

    @Override
    public int getItemType() {
        return R.layout.top;
    }
}

第二个布局的实体类Category.java

package com.example.mulrecyclerview;

public class Category implements Type{
    private int iconID;
    private String name;

    public Category(int iconID, String name) {
        this.iconID = iconID;
        this.name = name;
    }

    public int getIconID() {
        return iconID;
    }

    public String getName() {
        return name;
    }

    @Override
    public int getItemType() {
        return R.layout.container;
    }
}

创建适配器Adapter

package com.example.mulrecyclerview;

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.ImageView;
import android.widget.TextView;

import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    private Context mContext;
    private List<Type> mDataList;
    public static final int TOP_TYPE=R.layout.top;
    public static final int CONTAINER_TYPE=R.layout.container;
    public MyAdapter(Context mContext,List<Type> mDataList){
        this.mContext = mContext;
        this.mDataList = mDataList;
    }

    @Override
    public int getItemViewType(int position) {
        return mDataList.get(position).getItemType();
    }

    public static class TopViewHolder extends RecyclerView.ViewHolder{
        private TextView top_title;
        public TopViewHolder(View view){
            super(view);
            top_title = view.findViewById(R.id.top_title);
        }
    }
    public static class ContainerViewHolder extends RecyclerView.ViewHolder{
        private ImageView container_image;
        private TextView contaniner_title;
        public ContainerViewHolder(View view){
            super(view);
            container_image = view.findViewById(R.id.container_image);
            contaniner_title = view.findViewById(R.id.container_title);
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        if(viewType==TOP_TYPE){
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.top,viewGroup,false);
            return new TopViewHolder(view);
        }else if(viewType==CONTAINER_TYPE){
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.container,viewGroup,false);
            return new ContainerViewHolder(view);
        }
        return  null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        int type = getItemViewType(position);
        if(type==TOP_TYPE){
            Condition condition =(Condition) mDataList.get(position);
            TopViewHolder topViewHolder = (TopViewHolder)holder;
            topViewHolder.top_title.setText(condition.getTitle());
        }else if(type==CONTAINER_TYPE){
            Category category = (Category)mDataList.get(position);
            ContainerViewHolder containerViewHolder = (ContainerViewHolder)holder;
            containerViewHolder.container_image.setImageResource(category.getIconID());
            containerViewHolder.contaniner_title.setText(category.getName());
        }
    }

    @Override
    public int getItemCount() {
        return mDataList.size();
    }
}

主活动中初始化数据和添加布局

package com.example.mulrecyclerview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    List<Type> mDataList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        RecyclerView recyclerView = findViewById(R.id.recyclerview);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        MyAdapter myAdapter = new MyAdapter(this,mDataList);
        recyclerView.setAdapter(myAdapter);
    }
    public void init(){
        for(int i=0;i<50;i++){
            if(i<25){
                mDataList.add(new Condition("i am your yo"));
            }else{
                mDataList.add(new Category(R.drawable.ic_launcher_background,"yo yo yo"));
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值