RecyclerView详解

来源:互联网 发布:怎么学粤语 知乎 编辑:程序博客网 时间:2024/05/16 14:01

1.android5.0重要控件的介绍

①RecyclerView介绍:

     替换listview的盛装数据的控件,运用好这个控件能够很多的避免listview与scrollview的滚动冲突,选择RecyclerView性能更优,listview能做的事情,RecyclerView样样都会,甚至更多。

②FloatingActionButton介绍

   它是一种带有悬浮效果的控件,可以作为提示,编辑,分享的作用。

③Snack介绍

  更好的替代了Toast的功效,是一种不错的弹出效果的控件。

2.具体用法

添加依赖:

compile 'com.android.support:design:24.2.1'

①定义RecyclerView,FloatingActionButton控件

<android.support.v7.widget.RecyclerView    android:id="@+id/recyclerView"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:scrollbars="none"    app:layout_behavior="@string/appbar_scrolling_view_behavior" /><!-- 必须把anchor设置为CoordinatorLayout布局的id--><android.support.design.widget.FloatingActionButton    android:id="@+id/fab"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_margin="16dp"    android:src="@mipmap/icon"    app:backgroundTint="#FF4081"    app:borderWidth="0dp"    app:elevation="6dp"    app:fabSize="normal"    app:layout_anchor="@id/coordinator_layout"    app:layout_anchorGravity="bottom|right"    app:pressedTranslationZ="12dp"    app:rippleColor="#a6a6a6" />

②为RecyclerView设置动画

final RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);mRecyclerView.setItemAnimator(new DefaultItemAnimator());
③为RecyclerView设置布局管理器

1.线性布局:

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
2.瀑布流布局:

mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL));
 ④设置adpter:自定义adapter extends RecyclerView.Adapter

public class MyRecyclerAdapter extends RecyclerView.Adapter

⑤重写三个重载函数

1.onCreateViewHolder

@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    View view = LayoutInflater.from(context).inflate(R.layout.item,parent,false);    MyViewHolder viewHolder = new MyViewHolder(view);    //为每个item注册点击事件    view.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View v) {            if (mListener != null) {                //注意这里使用getTag方法获取数据                mListener.ItemClickListener(v,(String)v.getTag());            }        }    });    return viewHolder;}

在这里,创建真正的viewholder;

2.onBindViewHolder

@Overridepublic void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {        ViewGroup.LayoutParams params =  holder.itemView.getLayoutParams();//得到itemLayoutParams布局参数        params.height = heights.get(position);//把随机的高度赋予item布局        holder.itemView.setLayoutParams(params);//params设置给item布局    ((MyViewHolder)holder).mTv.setText(lists.get(position));//为控件绑定数据        if(mListener!=null){//如果设置了监听那么它就不为空,然后回调相方应的法            holder.itemView.setTag(lists.get(position));            holder.itemView.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View view) {                    mListener.ItemClickListener(view,"dianji");                }            });            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {                @Override                public boolean onLongClick(View v) {                    int pos = holder.getLayoutPosition();//得到当前点击item的位置pos                    mListener.ItemLongClickListener(holder.itemView,pos);//把事件交给我们实现的接口那里处理                    return true;                }            });        }}

为RecyclerView的每个item设置了点击事件,并且为view中的子view设置值;

3.getItemCount最为简单

@Overridepublic int getItemCount() {    return lists.size();}

3.为RecyclerView设置点击事件

①申明点击的接口

public interface OnRecyclerViewItemClickListener{    void ItemClickListener(View view, String data);    void ItemLongClickListener(View view, int postion);}
②创建点击的静态方法

public static void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {    mListener = listener;}
注意这个方法必须保证是静态。

③申明同上同类型的静态listener

private static OnRecyclerViewItemClickListener mListener;
④在onBindViewHolder中通过listener调用点击事件

if(mListener!=null){//如果设置了监听那么它就不为空,然后回调相方应的法    holder.itemView.setTag(lists.get(position));    holder.itemView.setOnClickListener(new View.OnClickListener() {        @Override        public void onClick(View view) {            mListener.ItemClickListener(view,"dianji");        }    });    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {        @Override        public boolean onLongClick(View v) {            int pos = holder.getLayoutPosition();//得到当前点击item的位置pos            mListener.ItemLongClickListener(holder.itemView,pos);//把事件交给我们实现的接口那里处理            return true;        }    });}

4.主代码展示

public class MainActivity extends ActionBarActivity {    private CoordinatorLayout mCoordinatorLayout;    MyRecyclerAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);        setSupportActionBar(mToolbar);        mCoordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinator_layout);        final RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);        mRecyclerView.setItemAnimator(new DefaultItemAnimator());        List<String> lists = new ArrayList<>();        for (int i = 0; i < 100; i++) {            lists.add(i + "");        }        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);        mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL));        adapter = new MyRecyclerAdapter(this, lists);        mRecyclerView.setAdapter(adapter);        MyRecyclerAdapter.setOnItemClickListener(new MyRecyclerAdapter.OnRecyclerViewItemClickListener() {            @Override            public void ItemClickListener(View view, String data) {                //Toast.makeText(MainActivity.this,"dainjile",Toast.LENGTH_SHORT).show();                Snackbar.make(mCoordinatorLayout,"点击了",Snackbar.LENGTH_SHORT).show();            }            @Override            public void ItemLongClickListener(View view, int postion) {            }        });        final FloatingActionButton mFloatingActionButton = (FloatingActionButton) findViewById(R.id.fab);        mFloatingActionButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {               mRecyclerView.scrollToPosition(0);            }        });    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.menu_main, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {            case R.id.snackbar_item:                //mCoordinatorLayout传给Snackbar                Snackbar.make(mCoordinatorLayout, "Snackbar", Snackbar.LENGTH_SHORT).show();                break;        }        return super.onOptionsItemSelected(item);    }}
这里,为FloatingActionButton设置了一个关于RecyclerView的item定位的点击事件

final FloatingActionButton mFloatingActionButton = (FloatingActionButton) findViewById(R.id.fab);        mFloatingActionButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {               mRecyclerView.scrollToPosition(0);            }        });
这里的Snack的用法如下,很简单,它不需要在xml文件中定义

Snackbar.make(mCoordinatorLayout, "Snackbar", Snackbar.LENGTH_SHORT).show();
注意:第一个参数为Snack要显示的viewgroup!!!

效果图:


好了,今天的分享就到此为止;在实战中学习,在实战中精进,我是张星,欢迎大家的关注!

















1 0