Android控件之RecyclerView的基本使用

本文介绍了Android控件RecyclerView,包括为何命名为RecyclerView,详细讲解了Adapter、ViewHolder、LayoutManager和ItemDecoration四个核心组件的功能,以及在实际使用中如何导入RecyclerView库。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

一、为什么叫RecyclerView?


1.不关心Item是否显示在正确的位置、如何显示。

2.不关心Item间的分割线。

3.不关注Item增加和删除的动画效果。

4.仅仅关注如何回收和复用View。

二、RecyclerView的基本属性:

1.RecyclerView.Adapter:托管数据集合,为每个Item创建视图;

2.RecyclerView.ViewHolder:承载Item视图的子视图;

3.RecyclerView.LayoutManager:负责Item视图的布局;

4.RecyclerView.ItemDecoration:为每个Item视图添加子视图,在Demo中被用来绘制Divider;

5.RecyclerView.ItemAnimator:负责添加、删除数据时的动画效果;

三、RecyclerView使用时要导入android.suport.v7.wedget.RecyclerView包。


RecyclerView实现添加和删除的简单例子
<span style="font-size:18px;">public class MainActivity extends AppCompatActivity {

    private List<String> mDatas;
    private Context mContext;
    private RecyclerView mRecyclerView;
    private RecyclerViewAdapter mAdapter;

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

       FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        mContext = MainActivity.this;

        initData();

        initView();

        //布局管理
        LinearLayoutManager llManager = new LinearLayoutManager(mContext);
        //设置布局管理器
        mRecyclerView.setLayoutManager(llManager);
        //设置分割线
        mRecyclerView.addItemDecoration(new DividerItemDecoration(this,LinearLayoutManager.VERTICAL));
        //设置删除、添加的动画
//        mRecyclerView.setItemAnimator(new SlideInOutRightItemAnimator(mRecyclerView));
//        mRecyclerView.setItemAnimator(new SlideInOutTopItemAnimator(mRecyclerView));
//        mRecyclerView.setItemAnimator(new SlideInOutLeftItemAnimator(mRecyclerView));
//        mRecyclerView.setItemAnimator(new ScaleInOutItemAnimator(mRecyclerView));
        mRecyclerView.setItemAnimator(new SlideInOutBottomItemAnimator(mRecyclerView));

        mAdapter = new RecyclerViewAdapter(mContext, mDatas);
        mRecyclerView.setAdapter(mAdapter);
    }

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

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_add) {
            mAdapter.add("New String",1);
            return true;
        }
        if(id == R.id.action_delete){
            mAdapter.remove(1);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}</span>

在menu中添加了增加和删除的按钮:
<menu 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"
      tools:context="com.jeffrey.demo.recyclerviewtest.MainActivity" >
    <item android:id="@+id/action_add"
          android:title="ADD"
          android:orderInCategory="100"
          android:icon="@drawable/add"
          app:showAsAction="always" />
    <item android:id="@+id/action_delete"
          android:title="DELETE"
          android:orderInCategory="100"
          android:icon="@drawable/delete"
          app:showAsAction="always" />
</menu>

RecyclerView的适配器:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder>{

    public static final int LAST_POSITION = -1 ;
    private List<String> mDatas;
    private Context mContext;
    private LayoutInflater mInflater;

    public RecyclerViewAdapter(Context context, List<String> datas) {
        mContext = context;
        mDatas = datas;
        mInflater = LayoutInflater.from(mContext);
    }

    /**
     * 创建ViewHolder
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public RecyclerViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.recycler_item, parent, false);
        MyViewHolder holder = new MyViewHolder(view);
        return holder;
    }

    /**
     * 绑定ViewHolder
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(final RecyclerViewAdapter.MyViewHolder holder, final int position) {
        holder.tvContent.setText(mDatas.get(position));
        holder.tvContent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取item在布局中的位置,防止添加或删除的item的psoition错误的问题
                int layoutPosition = holder.getLayoutPosition();
                Toast.makeText(mContext, "Position =" + layoutPosition, Toast.LENGTH_SHORT).show();
            }
        });
    }

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

    class MyViewHolder extends RecyclerView.ViewHolder{
        private TextView tvContent;
        public MyViewHolder(View itemView) {
            super(itemView);
            tvContent = (TextView) itemView.findViewById(R.id.tv_content);
        }
    }

    /**
     * 增加Item
     * @param s
     * @param position
     */
    public void add(String s,int position) {
        position = position == LAST_POSITION ? getItemCount()  : position;
        mDatas.add(position,s);
        notifyItemInserted(position);
    }

    /**
     * 删除Item
     * @param position
     */
    public void remove(int position){
        if (position == LAST_POSITION && getItemCount()>0)
            position = getItemCount() -1 ;

        if (position > LAST_POSITION && position < getItemCount()) {
            mDatas.remove(position);
            notifyItemRemoved(position);
        }
    }
}

因为本例子中点击Item会显示当前Item的位置,如果对其进行增加和删除操作,点击Item的位置会出现不正确的问题,可以通过ViewHolder中的方法获取当前Item在布局中的位置:
//获取item在布局中的位置,防止添加或删除的item的位置错误的问题
int layoutPosition = holder.getLayoutPosition();

效果展示:


我用动态截图做的,添加和删除的动画效果看不出来。

参考资料:


开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值