RecyclerView实现ListView和GridView的效果

本文详细介绍如何使用 RecyclerView 在 Android 应用中实现 ListView 和 GridView 的效果。通过具体实例展示了不同布局方式和方向的实现方法,并提供了完整的代码示例。

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

关于RecyclerView的详细创建步骤请见:http://blog.youkuaiyun.com/lixiang_y/article/details/61937111
在这里我就不过多的赘述了

下面我们要使用RecyclerView实现ListView和GridView的效果,完整代码及Demo

先看一下效果图:


主要逻辑代码:

MainActivity.java

package com.zhiyuan3g.myrecycleview;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.GridLayout;
import android.widget.Toast;

import com.zhiyuan3g.myrecycleview.adapter.RecyclerViewAdapter;
import com.zhiyuan3g.myrecycleview.adapter.RecyclerViewGridAdapter;
import com.zhiyuan3g.myrecycleview.bean.DataBean;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();


        //下面代码是菜单,方便效果展示,与recyclerView无关
        //加载一个菜单的布局

    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //加载布局,使用菜单特有方法getMenInfater,或Inflate对象
        //参数:1.菜单显示的布局  2.固定menu
        getMenuInflater().inflate(R.menu.menu_main,menu);
        return true;
    }

    //在每个if条件下填充相应的操作代码
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int itemId = item.getItemId();
        if (itemId == R.id.action_list_normal) {
            //标准显示
            loadListData(false,false,"List");
             Toast.makeText(getApplicationContext(), "标准显示", Toast.LENGTH_SHORT).show();

            return true;
        } else if (itemId == R.id.action_list_vertical_reverse) {
            //list:垂直反向显示
            loadListData(true,false,"List");
        } else if (itemId == R.id.action_list_horizontal) {
            //水平显示
            loadListData(false,true,"List");
        } else if (itemId == R.id.action_list_horizontal_reverse) {
            //水平反向显示
            loadListData(true,true,"List");
        } else if (itemId == R.id.gridview_normal) {
            //gridview:标准显示
            loadListData(false,false,"GridView");
        } else if (itemId == R.id.gridview_reverse) {
            //垂直反向显示
            loadListData(true,false,"GridView");
        } else if (itemId == R.id.gridview_horizontal_normal) {
            //水平标准显示
            loadListData(false,true,"GridView");
        } else if (itemId == R.id.gridview_horizontal_reserse) {
            //水平反向显示
            loadListData(true,true,"GridView");
        }
        return super.onOptionsItemSelected(item);
    }


    //封装listview的代码   添加两个参数 1.控制条目执行顺序, 2.控制条目的布局方向
    private void loadListData( boolean inversion,boolean oritation,String what) {
        //集合对象
        ArrayList<DataBean> datas = new ArrayList<>();
        //给bean类放数据,最后把封装好的数据的Bean类放到集合里
        for (int x=0; x<35 ;x++){
            //创建bean对象
            DataBean dataBean = new DataBean();
            dataBean.icon=R.mipmap.ic_launcher;
            dataBean.name="CCTV"+x;
            //把bean类放入集合
            datas.add(dataBean);


        }
        if (what.equals("List")) {
            //创建适配器adapter
            RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(this,datas);
            //设置适配器
            recyclerview.setAdapter(recyclerViewAdapter);

            //布局管理器所需参数,上下文
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
            //设置布局管理器
            recyclerview.setLayoutManager(linearLayoutManager);
            //通过布局管理器,可以控制条目排列的顺序,  true为反向显示   false为正常显示
            linearLayoutManager.setReverseLayout(inversion);

            //通过布局管理器设置orientation,可以设置为水平和垂直
            //添加三元运算符,当true时执行左边的,false时执行右边的,问题与结果之间是用?连接,
            //结果与结果之间是用 :连接
            linearLayoutManager.setOrientation(oritation ?LinearLayoutManager.HORIZONTAL:LinearLayoutManager.VERTICAL);

        } else if (what.equals("GridView")) {
            RecyclerViewGridAdapter recyclerViewGridAdapter = new RecyclerViewGridAdapter(this, datas);
            recyclerview.setAdapter(recyclerViewGridAdapter);
            //GridLayoutManager参数:1.上下文,  2.显示的列数(column)
            GridLayoutManager gridLayoutManager = new GridLayoutManager(this,3);
            recyclerview.setLayoutManager(gridLayoutManager);
            gridLayoutManager.setReverseLayout(inversion);
            gridLayoutManager.setOrientation(oritation? GridLayout.HORIZONTAL:GridLayout.VERTICAL);
        }

    }

    private void initView() {
        recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
    }
}

RecyclerViewAdapter.java

package com.zhiyuan3g.myrecycleview.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.zhiyuan3g.myrecycleview.R;
import com.zhiyuan3g.myrecycleview.bean.DataBean;

import java.util.List;


//RecyclerView的适配器,注意要指定泛型,
// 一般我们就是类名的ViewHolder继承ViewHolder(内部已经实现了复用优化机制)
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ListViewHolder> {

    private Context context;
    private List<DataBean> databean;

    //构造方法,一般需要接受两个参数,上下文,集合对象(包含我们的数据)
    public RecyclerViewAdapter(Context context, List<DataBean> databean) {
        this.context = context;
        this.databean = databean;
    }

    //创建ViewHolder(相当于item),并把ViewHolder返回出去。
    @Override
    public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //转换一个view布局对象,决定item的样子,参数:1.上下文  2.XML布局资源  3.为null
        View view = View.inflate(context, R.layout.item_list, null);
        //创建一个ViewHolder对象
        ListViewHolder listViewHolder = new ListViewHolder(view);
        //把创建出来的ViewHolder对象传出去
        return listViewHolder;
    }

    //当ViewHolder和数据绑定时,回调
    @Override
    public void onBindViewHolder(ListViewHolder holder, int position) {
        //从集合里拿对应item的数据对象
        DataBean dataBean = databean.get(position);
        //给holder里面的控件对象设置数据
        holder.setData(dataBean);

    }

    //决定RecyclerView有多少条
    @Override
    public int getItemCount() {
        //数据不为null,有几条数据就显示几条数据   ???
        if (databean != null&& databean.size()>0) {
            return databean.size();
        }
        return 0;
    }

    //自动帮我们写的ViewHolder,参数:view对象
    public class ListViewHolder extends RecyclerView.ViewHolder {

        private final ImageView mIvicon;
        private final TextView mTvname;

        public ListViewHolder(View itemView) {
            super(itemView);
            mIvicon = (ImageView)itemView.findViewById(R.id.item_list_iv_icon);
            mTvname = (TextView) itemView.findViewById(R.id.item_list_tv_name);
        }

        public void setData(DataBean dataBean) {
            //给imageview设置图片数据
            mIvicon.setImageResource(dataBean.icon);
            //给TextView设置文本数据
            mTvname.setText(dataBean.name);
        }
    }
}

RecyclerViewGridAdapter.java

package com.zhiyuan3g.myrecycleview.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.zhiyuan3g.myrecycleview.R;
import com.zhiyuan3g.myrecycleview.bean.DataBean;

import java.util.ArrayList;


//提示:RecyclerViewGridAdapter和RecyclerViewListAdapter代码一样,就是改了一下item加载显示的布局
//RecyclerView的适配器,要指定泛型,一般我们就是列类名的ViewHolder继承ViewHolder(内部已经实现了复用机制)
public class RecyclerViewGridAdapter extends RecyclerView.Adapter<RecyclerViewGridAdapter.ViewHolder> {
    private Context context;
    private ArrayList<DataBean> datas;

    public RecyclerViewGridAdapter(Context context, ArrayList<DataBean> datas) {
        this.context = context;
        this.datas = datas;
    }

    @Override
    public RecyclerViewGridAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //转换一个布局为view对象
        View view = View.inflate(context, R.layout.grid_item, null);
        //创建ViewHolder对象,传入view对象
        ViewHolder viewHolder = new ViewHolder(view);
        //返回viewholder对象
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerViewGridAdapter.ViewHolder holder, int position) {
        DataBean dataBean = datas.get(position);
        holder.setData(dataBean);

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {

        private final ImageView mIcon;
        private final TextView mDescribe;

        public ViewHolder(View itemView) {
            super(itemView);
            mIcon = (ImageView) itemView.findViewById(R.id.icon_img);
            mDescribe = (TextView) itemView.findViewById(R.id.describe_tv);
        }

        public void setData(DataBean dataBean) {
            mIcon.setImageResource(dataBean.icon);
            mDescribe.setText(dataBean.name);

        }
    }
}

DataBean.java

package com.zhiyuan3g.myrecycleview.bean;

/**
 *
 * Author:
 * Function: Bean类的下的变量类型是根据需要哪些数据来决定
 */
public class DataBean {
    public int icon;
    public String name;

}


完整Demo代码下载:http://pan.baidu.com/s/1gfMcQKN









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值