RecyclerView 多条目展示

首先开始写代码之前,要做好万全的准备工作

1.依赖

2.网络权限

3.搭框架

现在开始正式写代码了,完成以上的准备工作,现在开始按照步骤一步一步慢慢来,要是因为着急少些了某一步的话,整个项目就会白板甚至是崩溃

1.V层

public interface MainView {

    void success(String data);
    void fail();



}

V层没有什么好说的,写两个方法:一个成功的方法 里面参数传入Data,一个失败方法,可以什么参数也不传,也可以传入一个失败方法

2.M层接口

public interface MainModel {

    interface CallBackListener{
        void mSuccess(String data);
        void mFail();

    }
    void ShowData(CallBackListener listener);
}

M层接口里面的写一个展示数据的方法,里面传入一个接口回调的对象,然后在方法外面写一个接口回调

M层实现类

public class MainModelIml implements MainModel {
    @Override
    public void ShowData(CallBackListener listener) {
        //请求数据
    }
}

M层实现类要实现M层的接口,然后会重写M层接口里面的展示数据方法,本来是要在M层实现类这个方法里面请求数据的,但是因为时间关系所以我在后面的MainActivity里面直接请求数据了,所以这个方法里面就是空,不过不影响后面的效果展示.

3.P层

public interface MainPresenter {
    void ShowData();
}

P层实现类

public class MainPresenterIml implements MainPresenter,MainModel.CallBackListener {

    MainModel mainModel;
    MainView mainView;

    public MainPresenterIml(MainModel mainModel, MainView mainView) {
        this.mainModel = mainModel;
        this.mainView = mainView;
    }
    @Override
    public void ShowData() {
        mainModel.ShowData(this);
    }

    @Override
    public void mSuccess(String data) {
        mainView.success(data);
    }

    @Override
    public void mFail() {
        mainView.fail();
    }
}

这个P层的实现类就有点意思了,实现P层接口之后,还有在实现这个M层接口里面的这个接口回调,然后会重写接口回调中的成功和失败的方法,然后实例化M层接口和V层接口,给一个构造方法,然后在展示方法中调用Model层的展示方法,在成功和失败方法里面调用V层的成功失败方法

布局文件就不说了

然后是Adapter

public class MyAdapter extends RecyclerView.Adapter {

    private Context context;

    public MyAdapter(Context context) {
        this.context = context;
    }
    private List<UserBean.ItemsBean> list = new ArrayList<>();

    public void setList(List<UserBean.ItemsBean> list) {
        this.list = list;
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view;
        RecyclerView.ViewHolder holder = null;
        switch (i){
            case 0:
                view = View.inflate(context, R.layout.rlv_item1,null);
                holder = new MyViewHolder0(view);
                break;
            case 1:
                view = View.inflate(context, R.layout.rlv_item2,null);
                holder = new MyViewHolder1(view);
                break;
            case 2:
                view = View.inflate(context, R.layout.rlv_item3,null);
                holder = new MyViewHolder2(view);
                break;
        }
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
        UserBean.ItemsBean bean = list.get(i);
        if(viewHolder instanceof MyViewHolder0){
            String title = bean.getTitle();
            String desc = bean.getDesc();
            ((MyViewHolder0) viewHolder).desc.setText(desc);
            ((MyViewHolder0) viewHolder).title.setText(title);
            Glide.with(context).load(bean.getImage()).into(((MyViewHolder0)viewHolder).image);
        }else if(viewHolder instanceof MyViewHolder1){
            List<UserBean.ItemsBean.ImagesBean> imagesBean = list.get(i).getImages();
            Glide.with(context).load(imagesBean.get(0).getPic()).into(((MyViewHolder1) viewHolder).image1);
            Glide.with(context).load(imagesBean.get(1).getPic()).into(((MyViewHolder1) viewHolder).image2);
            Glide.with(context).load(imagesBean.get(2).getPic()).into(((MyViewHolder1) viewHolder).image3);
        }else{
            String title = bean.getTitle();
            ((MyViewHolder2) viewHolder).title.setText(title);
        }


    }

    @Override
    public int getItemViewType(int position) {
        int type = list.get(position).getType();
        return type;
    }

    @Override
    public int getItemCount() {
       if(list!=null){
            return list.size();
       }
        return 0;
    }

    private class MyViewHolder0 extends RecyclerView.ViewHolder {

        private final ImageView image;
        private final TextView title;
        private final TextView desc;

        public MyViewHolder0(@NonNull View itemView) {
            super(itemView);
            image = itemView.findViewById(R.id.image);
            title = itemView.findViewById(R.id.tv_title);
            desc = itemView.findViewById(R.id.tv_desc);
        }
    }

    private class MyViewHolder1 extends RecyclerView.ViewHolder {

        private final ImageView image1;
        private final ImageView image2;
        private final ImageView image3;

        public MyViewHolder1(@NonNull View itemView) {
            super(itemView);
            image1 = itemView.findViewById(R.id.image1);
            image2 = itemView.findViewById(R.id.image2);
            image3 = itemView.findViewById(R.id.image3);
        }
    }

    private class MyViewHolder2 extends RecyclerView.ViewHolder {


        private final TextView title;

        public MyViewHolder2(@NonNull View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.tv_title);
        }
    }
}

多条目的Adapter跟单条目大体上没有什么大的变化,只不过是获取了一个

    @Override
    public int getItemViewType(int position) {
        int type = list.get(position).getType();
        return type;
    }

获取了一个这个方法,这个方法的目的是用来在获取布局的方法中判断,如果=0执行第一种布局,如果=1就执行第二种布局,

然后在其他方法中也要做对应的判断

最后就是这个MainActivity

public class MainActivity extends AppCompatActivity {

    private RecyclerView rlv;
    private MyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        rlv = findViewById(R.id.rlv);

        //布局管理器
        LinearLayoutManager manager = new LinearLayoutManager(this);
        manager.setOrientation(LinearLayoutManager.VERTICAL);
        rlv.setLayoutManager(manager);

        //设置适配器
        adapter = new MyAdapter(this);
        rlv.setAdapter(adapter);
        ShowData();

    }

    private void ShowData() {
        new OkHttpUtils().get("https://code.aliyun.com/598254259/FristProject/raw/master/bw_list.txt").result(new OkHttpUtils.HttpListener() {

            private List<UserBean.ItemsBean> list = new ArrayList<>();

            @Override
            public void success(String data) {
                Gson gson = new Gson();
                UserBean userBean = gson.fromJson(data, UserBean.class);
                list = userBean.getItems();
                adapter.setList(list);

            }

            @Override
            public void fail(String error) {

            }
        });

    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值