一个RecyclerView搞定Listview、Gridview、瀑布流等

5.0的新特性中,RecyclerView觉得足够抢眼,由于ListView的的效率太低,RecyclerView中集成了之前我们所有的优化方案, 比如viewHolder等等,

并且它还附加了GridView和StaggeredGridLayout(瀑布流),样式多变,非常适合在开发中使用 在开发越来越重视效率的时代,不久ListView应该会完全被取代。

看了RecycleView的源码之后,发现它能被改造的空间实在是太大了,它正焦急的等待着我们去发掘,还是先从一个简单的例子来看看RecyclerView的使用方法吧,

其实和ListView的差别不大,一样的要使用适配器先贴出布局文件,activity-main如下


> <RelativeLayout
> 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" >
> 
> 
>     <LinearLayout
>         android:id="@+id/button_layout"
>         android:layout_width="wrap_content"
>         android:layout_height="70dp"
>         android:orientation="horizontal" >
> 
> 
>         <Button
>             android:id="@+id/button"
>             android:layout_width="wrap_content"
>             android:layout_height="wrap_content"
>             android:onClick="btnClick"
>             android:text="添加" />
> 
> 
>         <Button
>             android:id="@+id/button1"
>             android:layout_width="wrap_content"
>             android:layout_height="wrap_content"
>             android:onClick="btnClick"
>             android:text="GridView" />
> 
> 
>         <Button
>             android:id="@+id/button2"
>             android:layout_width="wrap_content"
>             android:layout_height="wrap_content"
>             android:onClick="btnClick"
>             android:text="瀑布" />
>     </LinearLayout>
> 
> 
>     <android.support.v7.widget.RecyclerView
>         android:id="@+id/rv_id"
>         android:layout_width="match_parent"
>         android:layout_height="match_parent"
>         android:layout_below="@id/button_layout" />
> 
> 
> </RelativeLayout>
上面是用来转换gridView和瀑布的按钮,下面是RecyclerView的写法

放一个items,我准备在java代码里动态

> <?xml version="1.0" encoding="utf-8"?> <LinearLayout
> xmlns:android="http://schemas.android.com/apk/res/android"
>     android:orientation="vertical"
>     android:layout_width="match_parent"
>     android:layout_height="match_parent"
>     android:padding="5dp"
>     >
> 
>     <TextView
>         android:id="@+id/tv_id"
>         android:background="#00f"
>         android:layout_margin="10dp"
>         android:layout_width="match_parent"
>         android:layout_height="match_parent"
>         android:textSize="20sp"/>
> 
> </LinearLayout>

好了,现在可以开始写适配器了
Myadapter.java

public class MyAdapter extends Adapter

可以看到,我们的适配器里指定的adapter的泛型是内部类ViewHolder,
它继承过来的四个三个方法里发现,我们之前ListView的getView方法不见了,换成了
onCreateViewHolder(ViewGroup parent, int viewType)和onBindViewHolder(MyViewHolder holder, int position)方法,查看参数就知道,ViewHolder是强制要创建的,然后在viewHolder类里findViewById去吧,可以为items的id添加一个点击事件。

现在的重点是怎么在MainActivity中实现布局间的切换,和对items点击响应事件,比如添加,删除,改变颜色什么的,你能想到就去做

public class MainActivity extends Activity implements OnClickListener {

private RecyclerView recyclerView;
private List<String> datas;
private MyAdapter myAdapter;

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

    recyclerView = (RecyclerView) findViewById(R.id.rv_id);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    // recyclerView.setLayoutManager(new GridLayoutManager(this, 6));
    // recyclerView.setLayoutManager(new StaggeredGridLayoutManager(5, 1));
    myAdapter = new MyAdapter(this, this);
    recyclerView.setAdapter(myAdapter);

    loadDatas();
}

private void loadDatas() {// 初始化数据
    datas = new ArrayList<>();
    for (int i = 0; i < 20; i++) {
        if (i % 3 == 0) {
            datas.add("内容-------->" + i);
        } else {
            datas.add("内容" + i);
        }
    }
    myAdapter.setDatas(datas);
}

public void btnClick(View v) {
    switch (v.getId()) {
    case R.id.button:

        // 点击添加按钮
        datas.add(3, "加1");// 在指定下标位置添加
        myAdapter.notifyItemInserted(3);
        break;
    case R.id.button1:
        recyclerView.setLayoutManager(new GridLayoutManager(this, 6));//指定表格的行数
        break;
    case R.id.button2:
        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(5, 1));
        break;

    default:
        break;
    }

}

@Override
public void onClick(View v) {// 整个ListView的点击事件,每次点击一个items,做删除操作
    int index = recyclerView.getChildPosition(v);//
    datas.remove(index);
    myAdapter.notifyItemRemoved(index);
}

}


这里的逻辑很简单,眼睛一亮就会发现RecycleView的一个方法,你可以在里面加入你想要的样式,表格或者瀑布,当然不止这两种,之前就说过,等你去发现吧!

recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setLayoutManager(new GridLayoutManager(this, 6));
“ recyclerView.setLayoutManager(new StaggeredGridLayoutManager(5, 1));
“`
看一下效果
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值