Android控件之RecylerView详解,及其点击事件的实现(回调函数)

工作内容:

RecylerView实现,及其点击事件

学习分享:

主要方法:

recyclerView.setLayoutManager(....) ;//设置布局方式,

布局方式:

LinearLayoutManager 线性(水平,垂直)

GridLayoutManager网格(默认是垂直方向)

StaggeredGridLayoutManager(行/列数,水平/垂直方向)瀑布流显示方式【注意xml中的设置,见下方代码】

recyclerView.setAdapter(adapter);// 设置适配器

recyclerView.addItemDecoration(); //设置分隔线

recyclerView.setHasFixedSize(true); //设置每项内容不会改变recyclerView的大小,可以提高性能

recyclerView.setItemAnimator(RecyclerView.ItemAnimator itemAnimator);//设置列表项动画(添加,删除)

Activity代码:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import test.android.com.testapplication.adapter.RecyAdapter;
import test.android.com.testapplication.base.OnRecylerItemClick;

public class RecylerActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private RecyAdapter adapter;
    private List<Integer> list;
    private int [] imgIDs = {R.drawable.a111,R.drawable.a112,R.drawable.a113,R.drawable.a114,R.drawable.a115
            ,R.drawable.a116,R.drawable.a117,R.drawable.a118,R.drawable.a119,R.drawable.a120,R.drawable.a121
            ,R.drawable.a122,R.drawable.a123,R.drawable.a124,R.drawable.a125,R.drawable.a126,R.drawable.a127
            ,R.drawable.a128,R.drawable.a129,R.drawable.a130,R.drawable.a111,R.drawable.a112,R.drawable.a113
            ,R.drawable.a114,R.drawable.a115,R.drawable.a116,R.drawable.a117,R.drawable.a118,R.drawable.a119
            ,R.drawable.a120,R.drawable.a121,R.drawable.a122,R.drawable.a123,R.drawable.a124,R.drawable.a125
            ,R.drawable.a126,R.drawable.a127,R.drawable.a128,R.drawable.a129,R.drawable.a130};
    private Toolbar toolbar;
    private LinearLayoutManager linear;
    private GridLayoutManager girdLayoutManager;
    private StaggeredGridLayoutManager staggeredGridLayoutManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recyler);
        initData();
        initView();
    }

    private void initData() {
        list = new ArrayList<>();
        for (int i = 0; i < imgIDs.length; i++) {
            list.add(imgIDs[i]);
        }
    }

    private void initView() {
        toolbar = (Toolbar)findViewById(R.id.toolbar_recy) ;
        setSupportActionBar(toolbar);
        recyclerView = (RecyclerView)findViewById(R.id.rv_recy);
        recyclerView.setHasFixedSize(true);  //设置每项不会改变recylerView的大小,可以提高性能
        /**
         * 表示显示方式(VERTICAL HORIZONTAL 横)单列/         */
        linear = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        /**
         * 参数1context  参数2:表示列数
         */
        girdLayoutManager=new GridLayoutManager(this,2);
        /**
         * 参数1:显示列数/行数  参数2:表示显示方式(VERTICAL 1 HORIZONTAL 0 横)
         * 【实现瀑布流】
         */
        staggeredGridLayoutManager=new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(staggeredGridLayoutManager);
        /**
         * 添加item的分隔线
         */

        adapter = new RecyAdapter(list);
        recyclerView.setAdapter(adapter);
//        recyclerView.addItemDecoration(); //设置分隔线,可以在item布局文件中写模拟的分隔线
        /**
         * 将回调函数的实现类传递进adaptersetOnRecylerItemClick方法中
         * 【实现长按recyView项的时候弹出一条提示】
         */
        adapter.setOnRecylerItemClick(new OnRecylerItemClick() {
            @Override
            public void onItemClick(int position) {
                Toast.makeText(RecylerActivity.this,list.get(position),Toast.LENGTH_SHORT).show();
            }
        });
    }

    //设置toolbar的右边图标
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_recy,menu);
        return super.onCreateOptionsMenu(menu);
    }
    /**
     * 点击toolbar上的右边按钮
     * 实现:显示的方式变换【横向,纵向】
     * 添加,删除recylerView中的项
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.menu_item1:
                //设置显示方式为linear
                recyclerView.setLayoutManager(linear);
                break;
            case R.id.menu_item2:
                recyclerView.setLayoutManager(girdLayoutManager);
                break;
            case R.id.menu_item3:
                recyclerView.setLayoutManager(staggeredGridLayoutManager);
                break;
            case R.id.add_menu_item:
                //添加项
                list.add(3,R.drawable.a115);
                adapter.notifyItemInserted(3);//插入位置是3【注意list和adapter中的添加位置保持一致//                adapter.notifyDataSetChanged();//也是生效的,动画效果没那么明显
                break;
            case R.id.cut_menu_item:
                //删除项
                list.remove(4);
                adapter.notifyItemRemoved(4);
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}
Adapter代码:

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import java.util.List;
import test.android.com.testapplication.base.OnRecylerItemClick;
import test.android.com.testapplication.R;

/**
 * Created by Administrator on 2016/9/7.
 */
public class RecyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener{
    private OnRecylerItemClick onRecylerItemClick;
    private List<Integer> list;
    public RecyAdapter(List<Integer> list) {
        this.list = list;
    }
    //解析布局文件并传回MyViewHolder
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyler,parent,false);
        MyViewHolder vh = new MyViewHolder(view);   //将解析的布局文件的view传进MyViewHolder
        return vh;
    }

    public void setOnRecylerItemClick(OnRecylerItemClick onRecylerItemClick) {
        this.onRecylerItemClick = onRecylerItemClick;
    }

    /**
     * 设置组件的显示内容(配置MyViewHolder的属性的值)
     * 记得向下转型成自定义的MyViewHolder
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final int position1 = position;
        MyViewHolder myViewHolder = (MyViewHolder)holder;
        myViewHolder.imageView.setBackgroundResource(list.get(position));
        //添加列表项的长按事件
        myViewHolder.imageView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                //回调接口中的方法
                onRecylerItemClick.onItemClick(position1);
                return true;
            }
        });
    }

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

    @Override
    public void onClick(View v) {

    }

    //自定义的持有者
    class MyViewHolder extends RecyclerView.ViewHolder{
        private ImageView imageView;
        public ImageView getTextView() {
            return imageView;
        }
        public void setTextView(ImageView imageView) {
            this.imageView = imageView;
        }
        //实现构造方法【必须】
        public MyViewHolder(View itemView) {
            super(itemView);
            //记得要findViewById找到组件
            imageView = (ImageView)itemView.findViewById(R.id.iv_item_recy);
        }
    }
}
回调接口代码:

public interface OnRecylerItemClick {
    void onItemClick(int position);
}
RecylerView项布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    >
    <!--
    下面的LinearLayout用于设置
    列表项之间的间距
    -->
    <LinearLayout
        android:layout_marginBottom="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:background="#F7F7F7"
        android:layout_centerInParent="true">
        <!--
        width="match_parent" && height="wrap_content"
        1.RecylerView用瀑布流布局管理管理时,竖向(纵向)显示时宽度平分给item,
        这里的宽度就会适应这个平分到的宽度,之后让高度自适应【图片设置成背景图片】,
        显示出的图片就会是:宽度 = 平分得到的宽度 高度 = 按比例缩放的高度(按宽度比例缩放)
        2.RecylerView用瀑布流布局管理管理时,横向,显示的高度平分给item...宽高设置与现在的设置相反就可以了
        【注意:外层布局应该用 width="wrap_content" height="wrap_content"        -->
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/a112"
            android:id="@+id/iv_item_recy"
            />
    </LinearLayout>
</RelativeLayout>
activity布局文件:

<?xml version="1.0" encoding="utf-8"?>
<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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    tools:context=".RecylerActivity">
    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/toolbar_recy"
        android:titleTextColor="#ffffff"
        android:background="@color/deepskyblue"
        android:title="切换显示风格"
        app:popupTheme="@style/OverflowMenuStyle"
        >
    </android.support.v7.widget.Toolbar>
    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rv_recy"
        >
    </android.support.v7.widget.RecyclerView>
</LinearLayout>
实现效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值