关闭

RecyclerView的相关用法简介

标签: java语言Android
89人阅读 评论(0) 收藏 举报
分类:
public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    List<String> mDatas;
    MyAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
        initData();//初始化数据
        mAdapter = new MyAdapter(mDatas, this);//初始化Adapter(设配器)
        mRecyclerView.setAdapter(mAdapter);//设置Adapter
        //设置分隔线
//        mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
        //必须要设置布局管理器,不然界面是空的

        ////////////////////////////////   完成listview的效果   //////////////////////////////
//        LinearLayoutManager layout = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,true);
//        mRecyclerView.setLayoutManager(layout);
        ////////////////////////////////   完成listview的效果   //////////////////////////////

        //设置gridview 的效果
//        mRecyclerView.setLayoutManager(new GridLayoutManager(this,3));

        //这里如果是水平的,item的宽度item的个数不足以填充宽度,itemitem之间会自动有空白来代替
        mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL));
        mAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {  //RecyclerViewitem点击事件
            @Override
            public void onItemClickListener(int position, View v) {
                mAdapter.add(position);
            }

            @Override
            public void onItemLongClickListener(int position, View v) {
                mAdapter.delete(position);
            }
        });
    }

    private void initData() {
        mDatas = new ArrayList<>();
        for (int i = 'A'; i < 'G'; i++) {
            mDatas.add((char) i + "");
        }
    }
}

Adapter类的代码:

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
    List<String> mList;
    Context mContext;
    private LayoutInflater mInflater;

    public MyAdapter(List<String> list, Context context) {
        mList = list;
        mContext = context;
        mInflater = LayoutInflater.from(mContext);
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //注意这里的参数只能改第一个参数resource,只能使用LayoutInflater.inflate.(resource,viewGroup,attachToRoot);
        View view = mInflater.inflate(R.layout.item, parent, false);
        MyViewHolder myViewHolder = new MyViewHolder(view);
        return myViewHolder;
    }

    public interface OnItemClickListener {
        void onItemClickListener(int position,View v);
        void onItemLongClickListener(int position,View v);
    }
    private OnItemClickListener mListener;
    public void setOnItemClickListener(OnItemClickListener listener) {
        mListener = listener;
    }
    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        if (mListener != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int layoutPosition = holder.getLayoutPosition();
                    mListener.onItemClickListener(layoutPosition,v);//要用holder.getLayoutPosition()的数,得到布局上的item的排序
                }
            });
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int layoutPosition = holder.getLayoutPosition();
                    mListener.onItemLongClickListener(layoutPosition,v);//这个position是不准确的,
                    // 因为当增删item,position会不准确,还是会依照一开始的条目排序,有时position并不是会随item改变而变
                    return false;
                }
            });
        }
        holder.mTv.setText(mList.get(position));
        //在这里设置随机高度
        ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
        layoutParams.height = 100 + r.nextInt(200);
        holder.itemView.setLayoutParams(layoutParams);
    }
    Random r = new Random();
    @Override
    public int getItemCount() {
        if (mList == null)
            return 0;
        return mList.size();
    }

    public void add(int position) {
        mList.add(position, "insert one");
        notifyItemInserted(position);//代表插入第几个item
    }

    public void delete(int position) {
        mList.remove(position);
        notifyItemRemoved(position);
    }
}

class MyViewHolder extends RecyclerView.ViewHolder {

    TextView mTv;

    public MyViewHolder(View itemView) {
        super(itemView);
        mTv = (TextView) itemView.findViewById(R.id.tv);
    }
}
item布局文件代码里面就一个TextView自己可以修改:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="72dp"
    android:layout_margin="3dp"
    android:orientation="vertical"
    android:layout_height="50dp"
    android:background="#5f00">

    <TextView
        android:id="@+id/tv"
        android:gravity="center"
        android:text="A"
        android:textColor="#fff"
        android:layout_width="72dp"
        android:layout_height="50dp"/>
</LinearLayout>

如果要简单自定义分隔线,可以在src/res/drawable里画些样式:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <size android:height="4dp"></size>
    <gradient
        android:centerColor="#0f0"
        android:endColor="#00f"
        android:startColor="#f00"
        android:type="linear"></gradient>
</shape>
记得要生效的话必须要在使用的主题里添加一行代码:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!--这是从DividerItemDecoration里面的属性来的,在你使用的主题里改变一下就可以-->
    <item name="android:listDivider">@drawable/divider02(这里是自己画的xml文件名)</item>
</style>

总结:RecyclerView比较强大,但是要自己实现item点击事件,主要的item里的position要注意,使用这个方法
holder.getLayoutPosition()来替代position,还有的话是

public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //注意这里的参数只能改第一个参数resource,只能使用LayoutInflater.inflate.(resource,viewGroup,attachToRoot);
    View view = mInflater.inflate(R.layout.item, parent, false);
//mInflater=android.view.LayoutInflater.from(mContext)
    MyViewHolder myViewHolder = new MyViewHolder(view);
    return myViewHolder;
}
不可以使用View.Inflate()方法

0
0
查看评论

整理一下RecyclerView好的开源框架

现在很少人用ListView了,整理一下RecyclerView好的开源框架。包括RecylerView,LayourMnager,Animators等等。
  • zhangdesheng007
  • zhangdesheng007
  • 2017-03-05 13:39
  • 1298

【FastDev4Android框架开发】RecyclerView完全解析,让你从此爱上它(二十八)

(一).前言:            话说RecyclerView已经面市很久,也在很多应用中得到广泛的使用,在整个开发者圈子里面也拥有很不错的口碑,那说明RecyclerView拥有比ListVie...
  • jiangqq781931404
  • jiangqq781931404
  • 2015-11-19 14:59
  • 15799

RecyclerView的基本使用方法

1.RecyclerView的使用方法(使用的Android Studio开发) 首先是recyclerview的配置问题,recyclerview是要导入android.support.v7.widget.RecyclerView的包。还要在Gradle Scripts中添加 compile ‘...
  • Javacainiao931121
  • Javacainiao931121
  • 2016-06-18 09:26
  • 12745

RecyclerView的使用(1)之HelloWorld

RecyclerView是伴随Android 5.0发布的新控件,Google意在用新的RecyclerView来取代老旧的ListView和GridView,它的灵活性和显示效果都要优于ListView,接下来通过一系列文章来了解RecyclerView的各种使用方法,本篇来介绍它的初步使用,Re...
  • leejizhou
  • leejizhou
  • 2016-02-16 22:24
  • 8636

关于RecyclerView的高级使用

老规矩先看效果: 咋一看和前几天写的那个用ListView嵌套GridView写的界面很像,但毕竟那个还是太Low了。http://blog.csdn.net/u012305710/article/details/50464982 Android已经推出了RecyclerView替换了Lis...
  • u012305710
  • u012305710
  • 2016-01-20 21:33
  • 1041

Android RecyclerView使用(一) 基本使用

RechclerView简介。RecyclerView比listview更先进更灵活,对于很多的视图它就是一个容器,可以有效的重用和滚动。 1.可以通过设置LayoutManager可以实现Listview和横向Listview,GridView,横向Gridview和瀑布流等效果。 2.可以通过a...
  • RaphetS
  • RaphetS
  • 2016-04-25 23:04
  • 1326

RecyclerView 教程,全面了解各种使用方法

RecyclerView 在2014年就已经出来了,15年的时候有了解一下,但是项目中一直没用上,最近看到,发现RecyclerView 出现了很多拓展,它的出现就是为了代替ListView、GridView。所以介绍一下RecyclerView该如何使用,及梳理一下这些拓展应该怎么用,是个什么效果...
  • xx326664162
  • xx326664162
  • 2017-03-13 18:51
  • 1951

JSP技术简介

    JavaServer PagesTM (JSP)技术为创建显示动态生成内容的Web页面提供了一个简捷而快速的方法。JSP技术的设计目的是使得构造基于Web的应用程序更加容易和快捷,而这些应用程序能够与各种Web服务器,应用服务器,浏览器和开发工具共同工作。...
  • jlusdy
  • jlusdy
  • 2005-05-16 13:00
  • 1044

recyclerView相关开源框架推荐

前段时间做项目由于采用的MD设计,所以必须要使用RecyclerView全面代替ListView。但是开发中遇到了需要实现RecyclerView上拉加载、下拉刷新和添加Header以及Footer等需求问题,现将问题解决中用到的五大开源项目总结下来,方便他人。 首先介绍下RecyclerVie...
  • JerryWu145
  • JerryWu145
  • 2016-10-25 23:11
  • 2313

RecyclerView的高级用法——定制动画

相信大家都对RecyclerView的用法相当熟悉了,RecyclerView的出现给我们开发者提供了一个高扩展的控件, 不管是列表、网格、瀑布流,一个控件就可以搞定,而且神奇的是只需要修改一行代码,就可以轻松切换。RecyclerView的好处太多太多,就不一一列举了,网上也有很多关于Recyc...
  • qibin0506
  • qibin0506
  • 2015-08-03 08:29
  • 20167
    个人资料
    • 访问:6065次
    • 积分:208
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:13篇
    • 译文:1篇
    • 评论:0条
    文章分类