Recyclerview的一些个人理解与使用(七)Recyclerview的嵌套与增加删除

来源:互联网 发布:网络体系结构的定义 编辑:程序博客网 时间:2024/06/06 19:10

目录:
Recyclerview的一些个人理解与使用(一)adapter的简单封装
Recyclerview的一些个人理解与使用(二)实现一个简单的列表界面
Recyclerview的一些个人理解与使用(三)列表中的计时器
Recyclerview的一些个人理解与使用(四)在界面中实现侧边栏效果
Recyclerview的一些个人理解与使用(五)Recyclerview的联动,时间选择的实现
Recyclerview的一些个人理解与使用(六)Recyclerview的分段加载
Recyclerview的一些个人理解与使用(七)Recyclerview的嵌套与增加删除

最近看了一阵kotlin,本来想把项目直接转为kotlin,但是有些地方一直未能成功,看来还需继续努力啊。因为目前公司项目已经比较稳定了,这次的功能也比较简单,为大家附上一般项目中比较常用两个的功能。
在项目中,有时单纯的Recyclerview并不能够满足项目的需求,往往需要一定层次的嵌套如:

大标题1:
内容,内容

大标题2:
内容,内容

大标题3:
内容,内容

这个时候对Recyclerview进行一层嵌套可以比较简单的完成需求
因为只是demo,做的比较简单,效果图如下:
这里写图片描述

思想很简单,最外层的Recyclerview的item的内容为一个textview与Recyclerview,再在子item中添加点击事件

Fragment布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"                android:layout_width="match_parent"                android:layout_height="match_parent">    <android.support.v7.widget.RecyclerView        android:id="@+id/nesting_rv"        android:layout_width="match_parent"        android:layout_height="match_parent"/></RelativeLayout>

item布局:

<LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="vertical"    >    <TextView        android:id="@+id/text"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center"        android:padding="5dp"        android:textColor="@color/blue"/>    <android.support.v7.widget.RecyclerView        android:id="@+id/nesting_rv"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="vertical"/></LinearLayout>

子item布局就是一个简单的textview就不放了。这里主要看item的adapter,在adapter中我们对子item的adapter添加了监听事件,并且设置了子item的数据,adapter代码:

/** * Created by ztn on 2017/6/19 */public class NestingRecyclerViewHolder extends RecyclerView.ViewHolder {    private TextView textView;    private RecyclerView recyclerView;    private NestingRecyclerViewChildAdapter nestingRecyclerViewChildAdapter;    private List<String> num;    public NestingRecyclerViewHolder(View itemView) {        super(itemView);        textView = (TextView) itemView.findViewById(R.id.text);        recyclerView = (RecyclerView) itemView.findViewById(R.id.nesting_rv);        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));        num = new ArrayList<>();        num.add(Math.random() + "");        num.add(Math.random() + "");        num.add(Math.random() + "");        num.add(Math.random() + "");    }    public void initView(final Context context, final String string,                         final NestingRecyclerViewAdapter.OnClickItemListener onClickItemListener, final int position) {        textView.setText(string);        nestingRecyclerViewChildAdapter = new NestingRecyclerViewChildAdapter(context, num);        recyclerView.setAdapter(nestingRecyclerViewChildAdapter);        nestingRecyclerViewChildAdapter.setOnClickItemListener(new NestingRecyclerViewChildAdapter.OnClickItemListener() {            @Override            public void onClick(String string, int position) {                Toast.makeText(context, string,Toast.LENGTH_SHORT).show();            }        });//        itemView.setOnClickListener(new View.OnClickListener() {//            @Override//            public void onClick(View v) {//                if (onClickItemListener != null)//                    onClickItemListener.onClick(string, position);//            }//        });    }}

这里使用了StaggeredGridLayoutManager用来实现GridView效果设置也比较加单,一个参数代表的个数,另一个参数代表的排列方式,这个过程基本是Recyclerview的流程走两边,没有什么难点,下面我们来说说Recyclerview的增加删除。

Recyclerview的增加需要调用 adapter.notifyItemInserted(num) 这个方法,删除需要调用 adapter.notifyItemRemoved(num) 这个方法。在实际使用的过程中我们还会发现一个问题,就是采取了这两种操作后变化的位置之后的item的position并没有改变,这个时候需要调用 adapter.notifyItemRangeChanged(0, data.size()-num) 来重置之后位置的position,效果图如下:
这里写图片描述

主要代码:

/** * Created by Administrator on 2017/6/19 */public class AddOrDeleteFragment extends LazyFragment {    AddOrDeleteHolder addOrDeleteHolder;    List<String> num;    MainRecyclerViewAdapter mainRecyclerViewAdapter;    public static Fragment newInstance() {        return new AddOrDeleteFragment();    }    @Override    protected void onCreateViewLazy(Bundle savedInstanceState) {        super.onCreateViewLazy(savedInstanceState);        setContentView(R.layout.addordelete);        num = new ArrayList<>();        for (int i = 0; i < 80; i++) {            num.add(i + "");        }        addOrDeleteHolder = new AddOrDeleteHolder(getContentView());        mainRecyclerViewAdapter = new MainRecyclerViewAdapter(getContext(), num);        addOrDeleteHolder.recyclerView.setAdapter(mainRecyclerViewAdapter);        //增加        addOrDeleteHolder.increase.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                num.add(3, "增加的view");                mainRecyclerViewAdapter.notifyItemInserted(3);            }        });        //删除        addOrDeleteHolder.delete.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (addOrDeleteHolder.recyclerView.getChildCount() > 3) {                    num.remove(3);                    mainRecyclerViewAdapter.notifyItemRemoved(3);                } else {                    Toast.makeText(getContext(), "3位置上没有view", Toast.LENGTH_SHORT).show();                }            }        });        addOrDeleteHolder.notify.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                mainRecyclerViewAdapter.notifyItemRangeChanged(0, num.size() - 2);            }        });        mainRecyclerViewAdapter.setOnClickItemListener(new MainRecyclerViewAdapter.OnClickItemListener() {            @Override            public void onClick(String string, int position) {                Toast.makeText(getContext(), "这个位置的position:" + position, Toast.LENGTH_SHORT).show();                Logger.d("当前num中的各个值:" + num.toString());            }        });    }}

基本就是这些东西,实现起来也很方便。
项目地址:

https://github.com/Liveinadream/RecyclerViewDemo#recyclerviewdemo

如有疑问大家可以添加 121606151 这个qq群@Crazy(即本人)即可,欢迎大家前来交流。

阅读全文
0 0