Recyclerview在项目中由浅到深的使用

最简单的Recyclerview

Recyclerview跟ListView一样,也需要写适配器,只是,它的适配器跟ListView有点差别:

public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.ViewHolder> {

    private Context context;
    private List<DataBean.ResultBean.FutureBean> list = new ArrayList<>();

    public SimpleAdapter(Context context, List<DataBean.ResultBean.FutureBean> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_rv_simple, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        DataBean.ResultBean.FutureBean futureBean = list.get(position);
        holder.tvTime.setText(futureBean.getDate() + "   " + futureBean.getWeek());
        holder.tvWind.setText("风力:" + futureBean.getWind());
        holder.tvTemperature.setText("温度:" + futureBean.getTemperature());
        holder.tvWeather.setText("天气:"+futureBean.getWeather());
    }

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

    static class ViewHolder extends RecyclerView.ViewHolder {
        @Bind(R.id.tv_time)
        TextView tvTime;
        @Bind(R.id.tv_weather)
        TextView tvWeather;
        @Bind(R.id.tv_wind)
        TextView tvWind;
        @Bind(R.id.tv_temperature)
        TextView tvTemperature;

        ViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }

}

Recyclerview的显示方式,是通过布局管理器LayoutManager来控制的,LinearLayoutManager能让Recyclerview像ListView般显示,通过控制LayoutManager的方向可以实现,垂直的列表或者水平滚动的列表;而GridLayoutManager能让Recyclerview像Gridview般显示,一行显示几个也可以控制;

GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);

给Recyclerview设置Adapter之前必须要先设置好LayoutManager,然后就可以设置Adapter了:

  DataBean dataBean = (DataBean) T;
                List<DataBean.ResultBean.FutureBean> list = dataBean.getResult().getFuture();
                mList.addAll(list);
                if (adapter == null) {
                    adapter = new SimpleAdapter(this, mList);
                    rvSimple.setAdapter(adapter);
                } else {
                    adapter.notifyDataSetChanged();
                }

Recyclerview的点击事件

  1. Recyclerview整个item的点击事件

Recyclerview并不像Listview一样可以直接添加子项点击事件;Recyclerview官方没有提供OnItemClickListener接口,所以Recyclerview想要实现点击事件,就得自己重写点击事件。
首先,写一个公共的接口,供所有的Recyclerview调用实现点击事件;

public interface MyItemClickListener {
void onItemClick(View view, int postion);
}

然后在Recyclerview的Adapter里面的ViewHolder添加view的点击事件:

static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@Bind(R.id.tv_time)
    TextView tvTime;
@Bind(R.id.tv_weather)
    TextView tvWeather;
@Bind(R.id.tv_wind)
    TextView tvWind;
@Bind(R.id.tv_temperature)
    TextView tvTemperature;

MyItemClickListener listener;

ViewHolder(View view, MyItemClickListener listener) {
super(view);
ButterKnife.bind(this, view);
this.listener = listener;
view.setOnClickListener(this);
}

@Override
public void onClick(View v) {
listener.onItemClick(v, getAdapterPosition());
}
}

public void setListener(MyItemClickListener listener) {
this.listener = listener;
}

在Activity中,先实现点击事件接口里面的方法,然后在创建Adapter之后,实现Adapter中的方法;就可以实现Recyclerview子项的点击事件了;

adapter.setListener(this);

@Override
public void onItemClick(View view, int postion) {
    Toast.makeText(context, "我是第" + postion + "项", Toast.LENGTH_SHORT).show();
}

2.Recyclerview Item中某个控件的点击事件

项目中偶尔会遇到,一个列表,不仅Item可以点击,Item里面的某个控件也可以点击;这时候,需要同时实现Recyclerview的多个点击事件,方法与前面类似,只不过在接口中添加多一个参数;
效果图如下:
这里写图片描述

全局的接口有所改变;

public interface MyItemClickTypeListener {
    void onItemClick(View view, int type , int postion);
}

Adapter中的ViewHolder的写法;

 static class ViewHolder extends RecyclerView.ViewHolder {

        @Bind(R.id.iv_head)
        CircleImageView ivHead;
        @Bind(R.id.tv_name)
        TextView tvName;
        @Bind(R.id.tv_myag_two)
        TextView tvMyagTwo;
        @Bind(R.id.tv_myag_three)
        TextView tvMyagThree;
        @Bind(R.id.ll_edit)
        LinearLayout llEdit;
        @Bind(R.id.ll_delete)
        LinearLayout llDelete;

        private MyItemClickTypeListener listener;

        ViewHolder(View view, MyItemClickTypeListener listener) {
            super(view);
            ButterKnife.bind(this, view);
            this.listener = listener;
            llEdit.setOnClickListener(new myClick(1));
            view.setOnClickListener(new myClick(2));
            llDelete.setOnClickListener(new myClick(3));
        }

        class myClick implements View.OnClickListener {

            int index = 0;

            public myClick(int i) {
                this.index = i;
            }

            @Override
            public void onClick(View v) {
                 listener.onItemClick(v, index , getAdapterPosition());  
                }
            }
        }

    }

    public void setListener(MyItemClickTypeListener listener) {
        this.listener = listener;
    }

在Activity中实现接口的方法:

@Override
    public void onItemClick(View view, int type, int postion) {
        Intent intent = new Intent();
        MyAGBean.ResultsBean.ListBean myAGBean = mList.get(postion - 1);
        switch (type) {
            case 1:
               new ExitDialog(MyAGActivity.this, "确认删除求货?", postion - 1, this);
                break;
            case 2:
               new ExitDialog(MyAGActivity.this, "确认删除求货?", postion - 1, this);
                break;
            case 3:
                new ExitDialog(MyAGActivity.this, "确认删除求货?", postion - 1, this);
                break;
        }
    }

用Recyclerview实现二级列表

项目之中可能会遇到二级列表的情况,简单来说,就是,一个列表的子项包含着一个列表;如图:

这里写图片描述

这里我的实现方式是用Recyclerview嵌套Recyclerview的方式,首先,列表Item里面的Recyclerview,它的Item的布局只是个简单的图片+文字;Adapter也是简单的Recyclerview的Adapter的写法,没什么特别;而一级列表的Item则是由一些控件加上一个Recyclerview构成;

xml布局代码:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="@dimen/margin_20"
    android:foreground="?android:attr/selectableItemBackground"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">


        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/white">

            <com.android.volley.toolbox.NetworkImageView
                android:id="@+id/iv_xrv_market_shop"
                android:layout_width="@dimen/margin_60"
                android:layout_height="@dimen/margin_60"
                android:layout_margin="@dimen/margin_10"
                android:background="@mipmap/ic_user_loading"
                android:scaleType="fitCenter" />

            <TextView
                android:id="@+id/tv_xrv_market_shop_title"
                style="@style/text_black_16"
                android:layout_alignTop="@+id/iv_xrv_market_shop"
                android:layout_margin="@dimen/margin_5"
                android:layout_toRightOf="@+id/iv_xrv_market_shop"
                android:text="我是标题" />

            <TextView
                android:id="@+id/tv_xrv_market_shop_info"
                style="@style/text_gray_16"
                android:layout_width="match_parent"
                android:layout_alignLeft="@+id/tv_xrv_market_shop_title"
                android:layout_below="@+id/tv_xrv_market_shop_title"
                android:layout_marginBottom="@dimen/margin_10"
                android:layout_toLeftOf="@+id/ll_fans"
                android:text="我是内容"
                android:textColor="@color/color_two_text"
                android:textSize="@dimen/text_size_14" />

            <LinearLayout
                android:id="@+id/ll_fans"
                android:layout_width="wrap_content"
                android:layout_height="@dimen/margin_43"
                android:layout_alignParentRight="true"
                android:layout_marginRight="@dimen/margin_18"
                android:background="@drawable/btn_bg"
                android:layout_alignTop="@+id/tv_xrv_market_shop_title"
                android:layout_marginTop="@dimen/margin_4"
                android:orientation="vertical">


                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/margin_0"
                    android:layout_weight="1"
                    android:drawableLeft="@mipmap/ic_market_fans"
                    android:gravity="center"
                    android:text="粉丝"
                    android:textColor="@color/white"
                    android:textSize="@dimen/text_size_12" />

                <TextView
                    android:id="@+id/tv_xrv_market_shop_fans"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/margin_0"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:paddingTop="@dimen/margin_2"
                    android:text="100人"
                    android:textColor="@color/white"
                    android:textSize="@dimen/text_size_12"
                    />
            </LinearLayout>

            <ImageView
                android:id="@+id/iv_xrv_market_shop_like"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />

        </RelativeLayout>

        <android.support.v7.widget.RecyclerView
            android:id="@+id/gv_xrv_market_shop"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="@dimen/margin_5"
            android:background="@color/white" />

        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/margin_0.5"
            android:background="@color/color_view" />

        <TextView
            android:id="@+id/tv_xrv_market_shop_in"
            android:layout_width="match_parent"
            android:layout_height="@dimen/margin_50"
            android:background="@color/white"
            android:gravity="center"
            android:text="进入店铺"
            android:textColor="@color/colorPrimary"
            android:textSize="@dimen/text_size_16" />
    </LinearLayout>
</android.support.v7.widget.CardView>

二级列表还有一个需要注意的点,就是第二级列表子项的点击事件,跟之前的点击事件有点区别;首先需要在二级列表的Adapter写一个接口可供一级列表的Adapter调用,并实现点击事件:

public class MarketShopGvAdapter extends RecyclerView.Adapter<MarketShopGvAdapter.ViewHolder> {

    private Context context;
    private TwoListener twoListener;
    private ImageLoader imageLoader;
    private List<MarketShopBean.ResultsBean.DataBean.ListBean> list = new ArrayList<>();

    public MarketShopGvAdapter(Context context, List<MarketShopBean.ResultsBean.DataBean.ListBean> list) {
        this.context = context;
        this.list = list;
        RequestQueue queue = Volley.newRequestQueue(context);
        imageLoader = new ImageLoader(queue, new BitmapCache());

    }

    //供一级列表调用的接口
    interface TwoListener {
        void setTwoListener(View view, int two);
    }

    public void setTwoListener(TwoListener twoListener) {
        this.twoListener = twoListener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_gv_title_img, parent, false);
        ViewHolder viewHolder = new ViewHolder(view,twoListener);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.ivGv.setErrorImageResId(R.mipmap.ic_erro_download_small);
        holder.ivGv.setDefaultImageResId(R.mipmap.ic_download_small);
        //根据屏幕分辨率设置图片宽高
        holder.ivGv.setImageUrl(list.get(position).getImg() + "/" + BaseMethod.getSwidth((Activity) context) / 3 + "/" + BaseMethod.getSwidth((Activity) context) / 4.8, imageLoader);
        holder.tvGvTitle.setText(list.get(position).getShow());
    }

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

    static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        @Bind(R.id.iv_gv)
        NetworkImageView ivGv;
        @Bind(R.id.tv_gv_title)
        TextView tvGvTitle;

        TwoListener twoListener;

        ViewHolder(View view, TwoListener twoListener) {
            super(view);
            ButterKnife.bind(this, view);
            this.twoListener = twoListener;
            //实现点击事件
            view.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            twoListener.setTwoListener(v, getAdapterPosition());
        }
    }
}

然后在一级列表的Adapter里面要实现两个方法供Activity调用:

public class MarketShopAdapter extends RecyclerView.Adapter<MarketShopAdapter.ViewHolder> {

    private Context context;
    private ImageLoader imageLoader;
    private OneListener oneListener;
    private MyItemClickListener listener;
    private List<MarketShopBean.ResultsBean.DataBean> list = new ArrayList<>();

    public MarketShopAdapter(Context context, List<MarketShopBean.ResultsBean.DataBean> list) {
        this.context = context;
        this.list = list;
        RequestQueue queue = Volley.newRequestQueue(context);
        imageLoader = new ImageLoader(queue, new BitmapCache());
    }

    //实现二级列表点击事件的接口,供Activity调用
    public interface OneListener {
        void setOneListener(View view, int one, int two);
    }

    public void setOneListener(OneListener oneListener) {
        this.oneListener = oneListener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(context).inflate(R.layout.item_xrv_market_shop, parent, false);
        ViewHolder viewHolder = new ViewHolder(view, listener);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        final int k = position;
        MarketShopBean.ResultsBean.DataBean dataBean = list.get(position);
        holder.ivXrvMarketShop.setErrorImageResId(R.mipmap.ic_user_loading);
        holder.ivXrvMarketShop.setDefaultImageResId(R.mipmap.ic_user_loading);
        holder.ivXrvMarketShop.setImageUrl(dataBean.getImg(), imageLoader);
        holder.tvXrvMarketShopTitle.setText(dataBean.getShop());
        if (dataBean.getInfo().isEmpty()) {
            holder.tvXrvMarketShopInfo.setText("这个人很懒,什么都没留下~");
        } else {
            holder.tvXrvMarketShopInfo.setText(dataBean.getInfo());
        }
        if (dataBean.getFans().isEmpty()) {
            holder.llFans.setVisibility(View.GONE);
        } else {
            holder.tvXrvMarketShopFans.setText(dataBean.getFans() + "人");
        }
        GridLayoutManager manager = new GridLayoutManager(context, 3);
        holder.gvXrvMarketShop.setLayoutManager(manager);
        MarketShopGvAdapter adapter = new MarketShopGvAdapter(context, list.get(position).getList());
        holder.gvXrvMarketShop.setAdapter(adapter);
        //实现回调
        MarketShopGvAdapter.TwoListener twoListener = new MarketShopGvAdapter.TwoListener() {
            @Override
            public void setTwoListener(View view, int two) {
                oneListener.setOneListener(view, k, two);
            }
        };
        adapter.setTwoListener(twoListener);
    }


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

    static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        @Bind(R.id.ll_fans)
        LinearLayout llFans;
        @Bind(R.id.iv_xrv_market_shop)
        NetworkImageView ivXrvMarketShop;
        @Bind(R.id.tv_xrv_market_shop_title)
        TextView tvXrvMarketShopTitle;
        @Bind(R.id.tv_xrv_market_shop_info)
        TextView tvXrvMarketShopInfo;
        @Bind(R.id.tv_xrv_market_shop_fans)
        TextView tvXrvMarketShopFans;
        @Bind(R.id.iv_xrv_market_shop_like)
        ImageView ivXrvMarketShopLike;
        @Bind(R.id.gv_xrv_market_shop)
        RecyclerView gvXrvMarketShop;
        @Bind(R.id.tv_xrv_market_shop_in)
        TextView tvXrvMarketShopIn;

        MyItemClickListener listener;

        ViewHolder(View view, MyItemClickListener listener) {
            super(view);
            ButterKnife.bind(this, view);
            this.listener = listener;
            //一级列表的点击事件
            view.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            listener.onItemClick(v, getAdapterPosition());
        }
    }

    public void setListener(MyItemClickListener listener) {
        this.listener = listener;
    }
}

在Activity或Fragment中实现方法:

public class MarketShopFragment extends Fragment implements MarketShopAdapter.OneListener



@Override
    public void setOneListener(View view, int one, int two) {
        Intent intent = new Intent();
        intent.putExtra("img", mList.get(one).getList().get(two).getImg() + "");
        intent.putExtra("gid", mList.get(one).getList().get(two).getGid() + "");
        intent.putExtra("shopid", mList.get(one).getList().get(two).getShopid() + "");
        intent.setClass(getActivity(), GoodsDetailActivity.class);
        startActivity(intent);
    }

多种Item的Recyclerview

当一个界面内容超过了手机屏幕,我们会选择用ScrollView,可滚动的布局,但是用过Scrollview的人都知道,Scrollview与Listview、GirdView、Recyclerview同时使用的时候,总会遇到各种各样的问题,谷歌官方也是不推荐我们将这几个控件与Scrollview同时使用。但是项目中,肯定会出现这些应用场景的,像我项目中遇到的一个界面,顶部是标题栏,然后就是viewpager切换的广告图,然后就是一个横屏滚动的列表,最下面的一个竖屏的列表,而且最下方的列表还需要做分页加载;像这样的一个界面,有几个解决办法:

  1. 外层加Scrollview;

  2. 界面布局只有最底层一个列表,其他布局均作为列表的Header;

  3. 利用getItemViewType为列表设置不同的item;

第一种的应用肯定会遇到各种各样的冲突,解决办法只有遇到一个解决一个;

第二种也比较简单,代码如下:

    View header = LayoutInflater.from(getActivity()).inflate(R.layout.list_article_viewpager, null);
    ViewPager view_pager = (ViewPager) header.findViewById(R.id.main_opearte_viewpager);
    LinearLayout ll_dian = (LinearLayout) header.findViewById(R.id.ll_dian);
    TextView tvTextview = (TextView) header.findViewById(R.id.tv_article_vp_title);
    //给viewpager设置adapter、布局设置属性等等
    listView.addHeaderView(header);

第三种,getItemViewType也有两个使用方式;

  1. 上面提到的一个界面有viewpager,横屏列表,竖屏列表,等等几个模块;
  2. 一个列表里面有几种不同的item;

    先以第一种为例,项目效果图如下:

    这里写图片描述

从图中可以看出,中间部分的这个界面由一个Recyclerview实现,而这个Recyclerview分成三种不同的布局,也就是说这个Recyclerview只有三个Item,因为是三种布局,所以在写Recyclerview的Adapter的时候,需要写三个ViewHolder;

首先,先定义一个数组,这个Recyclerview有几种布局,数组长度就为多少;

private int[] ids = {1, 2, 3};

 @Override
    public int getItemCount() {
        return ids.length;
    }

    @Override
    public int getItemViewType(int position) {
        return ids[position];
    }
  @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder viewHolder = null;
        View view;

        switch (viewType) {
            case 1:
                view = LayoutInflater.from(context).inflate(R.layout.item_xrv_user_detail_one, parent, false);
                OneViewHolder oneViewHolder = new OneViewHolder(view);
                viewHolder = oneViewHolder;
                break;
            case 2:
                view = LayoutInflater.from(context).inflate(R.layout.item_xrv_user_detail_two, parent, false);
                TwoViewHolder twoViewHolder = new TwoViewHolder(view,listener);
                viewHolder = twoViewHolder;
                break;
            case 3:
                view = LayoutInflater.from(context).inflate(R.layout.item_rv_ud_ag, parent, false);
                ThreeViewHolder threeViewHolder = new ThreeViewHolder(view);
                viewHolder = threeViewHolder;
                break;
        }
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        switch (getItemViewType(position)) {
            case 1:
                OneViewHolder oneViewHolder = (OneViewHolder) holder;
                if (infoResultsBean != null) {
                    oneViewHolder.tvUdName.setText(infoResultsBean.getName());
                }
                break;
            case 2:
                TwoViewHolder twoViewHolder = (TwoViewHolder) holder;
                if (resultsBean == null) {
                    twoViewHolder.rlShop.setVisibility(View.GONE);
                } else {
                    twoViewHolder.tvTitle.setText(resultsBean.getShop());                  
                }
                break;
            case 3:
                ThreeViewHolder threeViewHolder = (ThreeViewHolder) holder;
                LinearLayoutManager manager = new LinearLayoutManager(context);
                manager.setOrientation(LinearLayoutManager.VERTICAL);
                threeViewHolder.rvItem.setLayoutManager(manager);
                if (adapter == null) {
                    adapter = new UserAGAdapter(context, mList);
                    threeViewHolder.rvItem.setAdapter(adapter);
                } else {
                    adapter.notifyDataSetChanged();
                }
                adapter.setListener(listener);
                break;
        }
    }

这里需要注意的是,需要在各个子Item所需要的数据都得到后才能设置Adapter,不然会残缺某一块。

然后就是,一个Recyclerview中,有着不同的item,大概情况如下图:

这里写图片描述

这种与上面的不同,它的item长度不是2,而是整个list的长度;我在数据中加入多一个参数,用来判别是哪种类型的item,数据结构如下:

这里写图片描述

整个Adapter的代码是这样的:

public class AllCircleAdapter extends RecyclerView.Adapter {

    private Context context;
    private ImageLoader imageLoader;
    private OneListener oneListener;
    private TwoListener twoListener;
    private List<AllCircleBean.ResultsBean.ListBean> list = new ArrayList<>();

    public AllCircleAdapter(Context context, List<AllCircleBean.ResultsBean.ListBean> list) {
        this.context = context;
        this.list = list;
        RequestQueue queue = Volley.newRequestQueue(context);
        imageLoader = new ImageLoader(queue, new BitmapCache());
    }

    public interface OneListener {
        void OneListener(View view, int position);
    }

    public interface TwoListener {
        void TwoListener(View view, int position);
    }

    public void setOneListener(OneListener oneListener) {
        this.oneListener = oneListener;
    }

    public void setTwoListener(TwoListener twoListener) {
        this.twoListener = twoListener;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder viewHolder = null;
        OneViewHolder oneViewHolder;
        TwoViewHolder twoViewHolder;
        View view;
        switch (viewType) {
            case 1:
                view = LayoutInflater.from(context).inflate(R.layout.item_xrv_all_circle_one, parent, false);
                oneViewHolder = new OneViewHolder(view, oneListener);
                viewHolder = oneViewHolder;
                break;
            case 2:
                view = LayoutInflater.from(context).inflate(R.layout.item_xrv_all_circle_two, parent, false);
                twoViewHolder = new TwoViewHolder(view, twoListener);
                viewHolder = twoViewHolder;
                break;
        }
        return viewHolder;
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        AllCircleBean.ResultsBean.ListBean allCircleBean = list.get(position);
        switch (getItemViewType(position)) {
            case 1:
                OneViewHolder oneViewHolder = (OneViewHolder) holder;
                oneViewHolder.tvAllCircleTime.setText(allCircleBean.getGoods().getTime());
                break;
            case 2:
                TwoViewHolder twoViewHolder = (TwoViewHolder) holder;  
                AllCircleBean.ResultsBean.ListBean.GoodsBean goodsBean = allCircleBean.getGoods();
                twoViewHolder.tvAllCircleTitle.setText(goodsBean.getShop());
                break;
        }

    }

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

    @Override
    public int getItemViewType(int position) {
        return list.get(position).getT();
    }

    class OneViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        @Bind(R.id.iv_item_all_circle)
        CircleImageView ivItemAllCircle;
        @Bind(R.id.tv_all_circle_title)
        TextView tvAllCircleTitle;
        @Bind(R.id.tv_all_circle_info)
        TextView tvAllCircleInfo;
        @Bind(R.id.tv_all_circle_time)
        TextView tvAllCircleTime;
        private OneListener listener;

        OneViewHolder(View view, OneListener listener) {
            super(view);
            ButterKnife.bind(this, view);
            this.listener = listener;
            view.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            listener.OneListener(v, getAdapterPosition());
        }

    }


    static class TwoViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        @Bind(R.id.iv_item_all_circle)
        CircleImageView ivItemAllCircle;
        @Bind(R.id.tv_all_circle_title)
        TextView tvAllCircleTitle;
        @Bind(R.id.tv_goods_name)
        TextView tvGoodsName;
        @Bind(R.id.tv_all_circle_info)
        TextView tvAllCircleInfo;
        @Bind(R.id.tv_type)
        TextView tvType;
        @Bind(R.id.tv_price)
        TextView tvPrice;
        @Bind(R.id.tv_shop)
        TextView tvShop;
        @Bind(R.id.gv_circle)
        RecyclerView gvCircle;
        @Bind(R.id.tv_all_circle_time)
        TextView tvAllCircleTime;

        TwoListener listener;

        TwoViewHolder(View view, TwoListener listener) {
            super(view);
            ButterKnife.bind(this, view);
            this.listener = listener;
            view.setOnClickListener(this);
        }


        @Override
        public void onClick(View v) {
            listener.TwoListener(v, getAdapterPosition());
        }
    }

}

Recyclerview的下拉刷新以及分页加载

Recyclerview的下拉刷新以及分页加载在这里推荐使用XRecyclerview,简单易用,样式多且好看;
项目地址是:https://github.com/jianghejie/XRecyclerView

使用方法,在gradle中添加:

compile 'com.jcodecraeer:xrecyclerview:1.2.7'

xml中使用xRecyclerview:

            <com.jcodecraeer.xrecyclerview.XRecyclerView 
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:scrollbars="none" />

设置xRecyclerview的方式跟普通的Recyclerview一样:

LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(mAdapter);

然后就可以设置xRecyclerview的刷新与加载更多了:

mRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
    @Override
    public void onRefresh() {
       //refresh data here
    }

    @Override
    public void onLoadMore() {
       // load more data here
    }
});

如果刷新完成,则添加:

mRecyclerView.refreshComplete();

如果加载更多完成,则添加:

mRecyclerView.loadMoreComplete();

也可以通过代码设置下拉刷新以及上拉加载的样式:

mRecyclerView.setRefreshProgressStyle(int style);
mRecyclerView.setLaodingMoreProgressStyle(int style);
mRecyclerView.setArrowImageView(R.drawable.iconfont_downgrey);
mRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);

当然也可以禁止下拉或者上拉:

mRecyclerView.setPullRefreshEnabled(false);

也可以自定义Header或者footer,甚至还可以添加多个Header:

View header =   LayoutInflater.from(this).inflate(R.layout.recyclerview_header, (ViewGroup)findViewById(android.R.id.content),false);
View header1 =   LayoutInflater.from(this).inflate(R.layout.recyclerview_header1, (ViewGroup)findViewById(android.R.id.content),false);
mRecyclerView.addHeaderView(header);
mRecyclerView.addHeaderView(header1);

Recyclerview的批量删除

Recyclerview的批量删除里面,首先每个Item里面都有一个Checkbox,而且默认是隐藏的,只有点击删除按钮才会出现,效果图如下:

这里写图片描述

所以这时候需要在Adapter里面添加一个全局静态变量,在activity中,通过点击按钮改变这个变量的值从而改变Recyclerview中的Checkbox的显隐状态;

     //Aadpter中添加的变量
     public static boolean isSee = false;
     //Adapter中,通过变量显示或隐藏CHeckbox
     if (isSee) {
        holder.cbDelete.setVisibility(View.VISIBLE);  
      } else {
        holder.cbDelete.setVisibility(View.GONE);
      }

    //Activity中,点击按钮改变Checkbox的状态
     if (adapter != null) {
        if (CollectListAdapter.isSee) {
            CollectListAdapter.isSee = false;        
             } else {
             CollectListAdapter.isSee = true;
             }
             adapter.notifyDataSetChanged();
       }

然后则需要在Adapter中添加多一个HashMap,来记录Recyclerview每一个Item中Checkbox的选中状态;

public static HashMap<Integer, Boolean> checked = new HashMap<>();

 if (isSee) {
        holder.cbDelete.setChecked(checked.get(position) != null);
     }

在Activity中,同时需要一个HashMap来存放需要删除的值,比如说这个Recyclerview的item中的id等等,在Recyclerview的点击事件中,同时设置Adapter中的HashMap以及Activity中的HashMap;

        if (CollectListAdapter.checked.get(postion - 1) == null) {
            CollectListAdapter.checked.put(postion - 1, true);
            selectlist.put(postion - 1, mList.get(postion - 1).getFid());
            } else {
                CollectListAdapter.checked.remove(postion - 1);
                selectlist.remove(postion - 1);
            }
            adapter.notifyDataSetChanged();

selectlist中的String则是我们需要删除的数据,执行删除操作的时候将这些值传给服务器即可。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值