RecylerView---代替ListView,GridView和瀑布流的新控件

从android元年2009年至今,我们已经走过了7年的光辉历程。android平台为人类智能时代的推进作出了巨大贡献,其平台庞大丰富的开发控件使我们在app开发过程中其乐无穷。但是,随着社会的发展,人类需求的不断升级增多,系统的控件自诞生就存在的缺陷和不足满满显现出来了,例如最常见的ListView,GridView或者瀑布流(以下简称‘三剑客’)通畅作为app页面列表最佳展示方式的控件使用起来模式固定,条目的大小设置,大数据展示时的计算速度,内存的占用和拓展的灵活性都是不足之处,那么今天给大家介绍一个google推荐的新控件-RecylerView !RecylerView封装在”com.android.support:recyclerview-v7”中,使用方式和传统的‘三剑客’类似,先创建adapter,然后将adapter设置给控件,不同的是recylerview的adapter自己单独封装了,将条目view的创建逻辑和数据操作逻辑分离开来,正所谓‘MVC’的集中体现!好,下面我们就来介绍它的使用方法:

首先要在build.gradle中倒入资源库:

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

然后开始使用:

1.布局文件

<?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"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <!--线性布局和瀑布流时orientation设置为"vertical";网格布局时orientation设置为"horizontal"-->
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view_test_rv"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:orientation = "vertical"
        android:layout_height="match_parent"
        android:background="#bbccaa" />
</LinearLayout>

2.主activity

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Singleton singleton = Singleton.instance;
        String content = singleton.toString();

        List<Person> personList = new ArrayList<Person>();
        for (int i = 0; i < 180; i++) {
            Person p1 = new Person();
            p1.setAge(10);
            p1.setName(content);
            personList.add(p1);
        }
//
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view_test_rv);
        recyclerView.setHasFixedSize(true);

        //线性布局
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
        //VERTICAL竖向列表 ;HORIZONTAL横向列表;
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);
        //网格布局,10表示每行的列数
//        GridLayoutManager gridlayoutManger = new GridLayoutManager(this, 10);
//        recyclerView.setLayoutManager(gridlayoutManger);
        //瀑布流,3表示每行的列数
//       StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
//       recyclerView.setLayoutManager(staggeredGridLayoutManager);

        PersonAdapter adapter = new PersonAdapter(personList);
        adapter.setOnRecyclerViewListener(new PersonAdapter.OnRecyclerViewListener() {
            @Override
            public void onItemClick(int position) {
                Toast.makeText(MainActivity.this, "this is " + position, Toast.LENGTH_SHORT).show();
            }

            @Override
            public boolean onItemLongClick(int position) {
                return false;
            }
        });
        recyclerView.setAdapter(adapter);
    }
}

Singleton类

enum Singleton {

    instance;

    @Override
    public String toString() {
        return "recylerview---111";
    }
}

person类:

public class Person {

    private String name;

    private int age;

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

3.RecylerView的adapter

public class PersonAdapter extends RecyclerView.Adapter {
    public interface OnRecyclerViewListener {
        void onItemClick(int position);

        boolean onItemLongClick(int position);
    }

    private OnRecyclerViewListener onRecyclerViewListener;

    public void setOnRecyclerViewListener(OnRecyclerViewListener onRecyclerViewListener) {
        this.onRecyclerViewListener = onRecyclerViewListener;
    }

    private List<Person> list;

    public PersonAdapter(List<Person> list) {
        this.list = list;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_view_test_item_person, null);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        view.setLayoutParams(lp);
        return new PersonViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
        PersonViewHolder holder = (PersonViewHolder) viewHolder;
        Person person = list.get(i);
        holder.nameTv.setText(person.getName());
        holder.ageTv.setText(person.getAge() + "岁");
    }

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

    class PersonViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
        public View rootView;
        public TextView nameTv;
        public TextView ageTv;

        public PersonViewHolder(View itemView) {
            super(itemView);
            nameTv = (TextView) itemView.findViewById(R.id.recycler_view_test_item_person_name_tv);
            ageTv = (TextView) itemView.findViewById(R.id.recycler_view_test_item_person_age_tv);
            rootView = itemView.findViewById(R.id.recycler_view_test_item_person_view);
            rootView.setOnClickListener(this);
            rootView.setOnLongClickListener(this);
            rootView.setLayoutParams(new LinearLayout.LayoutParams(200, 200));
        }

        @Override
        public void onClick(View v) {
            if (null != onRecyclerViewListener) {
                onRecyclerViewListener.onItemClick(getPosition());
            }
        }

        @Override
        public boolean onLongClick(View v) {
            if (null != onRecyclerViewListener) {
                return onRecyclerViewListener.onItemLongClick(getPosition());
            }
            return false;
        }
    }

}

4.adapter的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recycler_view_test_item_person_view"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="15dp"
    android:background="#aabbcc">

    <TextView
        android:id="@+id/recycler_view_test_item_person_name_tv"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:textSize="18sp"
        android:background="#ccbbaa" />

    <TextView
        android:id="@+id/recycler_view_test_item_person_age_tv"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:paddingLeft="5dp"
        android:background="#aaccbb"
        android:textSize="15sp" />
</LinearLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值