天天看點

android控件recyclerView的使用

Android控件RecyclerView與ListView的異同

優點:Android中RecyclerView控件支援線性布局、網格布局、瀑布流布局 三種,還可以而且同時還能夠控制橫向和縱向滾動。自帶添加item和删除item的動畫效果

缺點:RecyclerView自身沒有點選事件,需要寫接口,在onBindViewHolder方法中添加點選事件

實作效果圖:

android控件recyclerView的使用

第一步:在build.gradle中添加一行,引用類庫

compile 'com.android.support:recyclerview-v7:23.2.1'      

第二步:在activity_main.xml檔案中,添加控件

<android.support.v7.widget.RecyclerView
    android:id="@+id/recy_list"
    android:dividerHeight="1dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />      

第三步:建立一個item.xml,這個布局主要用于顯示RecyclerView清單項的布局,讀者可根據實際情況自行添加

第四步:建立一個擴充卡,用于設定RecyclerView的清單項布局,并且添加點選事件

public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> {
    private  OnItemClickListener mOnItemClickListener;
    private List<Bitmap> mDatas;
    private Context mContext;
    private LayoutInflater inflater;

    public MyRecyclerAdapter(Context context, List<Bitmap> datas){
        this. mContext=context;
        this. mDatas=datas;
        inflater=LayoutInflater. from(mContext);
    }

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

    //重寫onCreateViewHolder方法,傳回一個自定義的ViewHolder
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.item_home,parent, false);
        MyViewHolder holder= new MyViewHolder(view);
        return holder;
    }

    class MyViewHolder extends RecyclerView.ViewHolder{
        ImageView iv;

        public MyViewHolder(View view) {
            super(view);
            iv=(ImageView) view.findViewById(R.id.iv_item_adapter);
        }
    }

    public interface OnItemClickListener{
        void onClick( int position);
        void onLongClick( int position);
    }
    public void setOnItemClickListener(OnItemClickListener onItemClickListener ){
        this.mOnItemClickListener=onItemClickListener;
    }

    //填充onCreateViewHolder方法傳回的holder中的控件
    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        holder. iv.setImageBitmap(mDatas.get(position));

        if( mOnItemClickListener!= null){
            holder. itemView.setOnClickListener( new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    mOnItemClickListener.onClick(position);
                }
            });

            holder. itemView.setOnLongClickListener( new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    mOnItemClickListener.onLongClick(position);
                    return false;
                }
            });
        }
    }
}      

第五步:在MainActivity檔案中,導入布局,設定擴充卡

public class MainActivity extends Activity {
    //參考網址   https://blog.csdn.net/dmk877/article/details/50816933
    private RecyclerView recyclerView;
    private List<Bitmap> mDatas;
    private MyRecyclerAdapter recycleAdapter;

    @SuppressLint("NewApi") @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout. test);

        recyclerView = (RecyclerView) findViewById(R.id.recy_list);

        initData();
        recycleAdapter= new MyRecyclerAdapter(ImageActivity.this , mDatas );

        /**第一種形式:普通的listview清單效果
         LinearLayoutManager layoutManager = new LinearLayoutManager(this);
         //設定布局管理器
         recyclerView.setLayoutManager(layoutManager);
         //設定為垂直布局,這也是預設的
         layoutManager.setOrientation(OrientationHelper.VERTICAL);
         //設定Adapter
         recyclerView.setAdapter( recycleAdapter);
         //設定增加或删除條目的動畫
         recyclerView.setItemAnimator(new DefaultItemAnimator());  */

        /**第二種形式:設定成gridview形式
         LinearLayoutManager layoutManager = new LinearLayoutManager(this);
         //設定布局管理器
         recyclerView .setLayoutManager(new GridLayoutManager( this,4));
         //設定為垂直布局,這也是預設的
         layoutManager.setOrientation(OrientationHelper.VERTICAL);
         //設定Adapter
         recyclerView.setAdapter( recycleAdapter);
         //設定增加或删除條目的動畫
         recyclerView.setItemAnimator(new DefaultItemAnimator());
         */

        /**第三種形式:橫向左右滑動
         StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.HORIZONTAL);
         //設定布局管理器
         recyclerView.setLayoutManager(layoutManager);
         layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
         recyclerView.setAdapter( recycleAdapter);
         //設定增加或删除條目的動畫
         recyclerView.setItemAnimator(new DefaultItemAnimator());
         */
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        //設定布局管理器
        recyclerView .setLayoutManager(new GridLayoutManager( this,4));
        //設定為垂直布局,這也是預設的
        layoutManager.setOrientation(OrientationHelper.VERTICAL);
        //設定Adapter
        recyclerView.setAdapter( recycleAdapter);
        //設定增加或删除條目的動畫
        recyclerView.setItemAnimator(new DefaultItemAnimator());

        recycleAdapter.setOnItemClickListener(new MyRecyclerAdapter.OnItemClickListener() {

            @Override
            public void onLongClick(int position) {
                Toast.makeText(ImageActivity.this,"onLongClick事件您點選了第:"+position+"個Item",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onClick(int position) {
                Toast.makeText(ImageActivity.this,"onClick事件您點選了第:"+position+"個Item",Toast.LENGTH_SHORT).show();
            }
        });

    }

    private void initData() {
        mDatas = new ArrayList<Bitmap>();
        mDatas.add(BitmapFactory.decodeResource(getResources(),R.mipmap.a1));
        mDatas.add(BitmapFactory.decodeResource(getResources(),R.mipmap.a2));
        mDatas.add(BitmapFactory.decodeResource(getResources(),R.mipmap.a3));
        mDatas.add(BitmapFactory.decodeResource(getResources(),R.mipmap.a4));
        mDatas.add(BitmapFactory.decodeResource(getResources(),R.mipmap.a5));
        mDatas.add(BitmapFactory.decodeResource(getResources(),R.mipmap.a6));
    }
}