【Android】只为更方便--RecyclerView的使用(一)

 RecyclerView是Android 5.0 materials design中的组件之一,相应的还有CardView、Palette等。看名字Re我们就能看出一点端倪,没错,它主要的特点就是复用。我们知道,Listview中的Adapter中可以实现ViewHolder的复用。RecyclerView提供了一个耦合度更低的方式来复用ViewHolder,并且可以轻松的实现ListView、GridView以及瀑布流的效果。

对于RecyclerView的初步使用,目标定为:

1.使用RecyclerView实现ListView和GridView之间的随意切换

2.为RecyclerView添加Item的点击和长按事件

3.对RecyclerView进行Item项的添加与删除操作

Demo的样图:


首先我们要搞清楚的与RecyclerView相关的类 Adapter(熟悉的适配器)、ViewHolder(Google为了规范开发者也是煞费苦心呐)、LayoutManager(用于设置RecyclerView的布局样式)、ItemDecoration(设置间距)、ItemAnimator(设置动画效果)具体为:

import android.support.v7.widget.RecyclerView.Adapter;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
使用RecyclerView需要引入你的Android SDK 中v7下的RecyclerView包

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:recyclerview-v7:23.0.1'
    compile 'com.android.support:appcompat-v7:23.0.1'
}
首先在布局中使用android.support.v7.widget.RecyclerView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.xiaoping.recyclerview.MainActivity"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_add"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:text="Add"/>
        <Button
            android:id="@+id/btn_del"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:text="Del"/>

        <RadioGroup
            android:id="@+id/radioGroup"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="right"
            android:layout_marginTop="15dp"
            android:layout_marginRight="15dp"
            android:orientation="horizontal"
            >
            <RadioButton
                android:id="@+id/radioList"
                android:layout_width="50dp"
                android:layout_height="30dp"
                android:layout_gravity="center"
                android:gravity="center"
                android:text="列表"
                android:checked="true"
                android:paddingTop="4dp"
                android:paddingBottom="4dp"
                android:paddingLeft="8dp"
                android:paddingRight="8dp"
                android:textColor="@drawable/selector_tab_item_text"
                android:background="@drawable/selector_radio_me"
                android:button="@null"
                />
            <RadioButton
                android:id="@+id/radioGrid"
                android:layout_width="50dp"
                android:layout_height="30dp"
                android:layout_gravity="center"
                android:gravity="center"
                android:text="网格"
                android:paddingTop="4dp"
                android:paddingBottom="4dp"
                android:paddingLeft="8dp"
                android:paddingRight="8dp"
                android:textColor="@drawable/selector_tab_item_text"
                android:background="@drawable/selector_radio_friends"
                android:button="@null"
                />
        </RadioGroup>
    </LinearLayout>


    <android.support.v7.widget.RecyclerView
        android:id="@+id/recylerview"
        android:layout_height="match_parent"
        android:layout_width="match_parent"/>

</LinearLayout>

在使用RecyclerView的过程中也可以类比我们熟悉的ListView

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private RecyclerView recyclerView;
    private List<String> mList;
    private MyAdapter adapter;
    private RadioGroup radioGroup;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initDatas();
        initView();

        adapter = new MyAdapter(this, mList);
        //为recyclerView设置适配器
        recyclerView.setAdapter(adapter);
        //为recyclerView设置布局方式
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
        //为recyclerView设置Item的间距
        //recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST));
        //为recyclerView设置动画
        recyclerView.setItemAnimator(new DefaultItemAnimator());

        adapter.setOnItemClickLister(new MyAdapter.OnItemClickLister() {
            @Override
            public void OnItemClickLister(View view, int pos) {
                Toast.makeText(MainActivity.this,"CLick:" + mList.get(pos),Toast.LENGTH_SHORT).show();
            }
            @Override
            public void OnItemLongClickLister(View view, int pos) {
                Toast.makeText(MainActivity.this,"LongCLick:" + mList.get(pos),Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void initView() {
        recyclerView = (RecyclerView) findViewById(R.id.recylerview);
        findViewById(R.id.btn_add).setOnClickListener(this);
        findViewById(R.id.btn_del).setOnClickListener(this);
        radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId){
                    case R.id.radioList:
                        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false));
                        break;
                    case R.id.radioGrid:
                        recyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this,3,GridLayoutManager.VERTICAL,false));
                        break;

                }
            }
        });
    }

    //准备数据
    private void initDatas() {
        mList = new ArrayList<String>();
        for (int i = 'A'; i <= 'z'; i++) {
            mList.add("" + (char)i);
        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_add:
                adapter.addItem(1);
                break;
            case R.id.btn_del:
                adapter.delItem(0);
                break;
        }
    }
}

适配器:

public class MyAdapter extends Adapter<MyViewHolder> {

    private List<String> mList;
    private Context mContext;
    private LayoutInflater inflater;

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

    public interface OnItemClickLister {
        void OnItemClickLister(View view, int pos);

        void OnItemLongClickLister(View view, int pos);
    }

    private OnItemClickLister itemClickLister;

    public void setOnItemClickLister(OnItemClickLister itemClickLister) {
        this.itemClickLister = itemClickLister;
    }

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

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int pos) {
        holder.tv.setText(mList.get(pos));
        if(itemClickLister != null){
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //使用ViewHolder取到的postion可以避免positon的错乱
                    int layoutPostion = holder.getLayoutPosition();
                    //回调接口中的方法
                    itemClickLister.OnItemClickLister(holder.itemView,layoutPostion);
                }
            });
            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int layoutPostion = holder.getLayoutPosition();
                    itemClickLister.OnItemLongClickLister(holder.itemView,layoutPostion);
                    return true;
                }
            });
        }
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {
        View view = inflater.inflate(R.layout.item, arg0, false);
        MyViewHolder viewHolder = new MyViewHolder(view);
        return viewHolder;
    }

    public void addItem(int postion){
        mList.add(postion, "AddItem");
        //int pos =  ViewHolder.getLayoutPosition();
        notifyItemInserted(postion);
    }

    public void delItem(int postion){
        if(mList.size() > postion){
            mList.remove(postion);
            //int pos =  viewHolder.getLayoutPosition();
            notifyItemRemoved(postion);
        }

    }

}

class MyViewHolder extends ViewHolder {
    TextView tv;

    public MyViewHolder(View itemView) {
        super(itemView);
        tv = (TextView) itemView.findViewById(R.id.tv_item);
    }

}

点击下载源码



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值