RecyclerView

一.简介

RecyclerView是Android一个更强大的控件,其不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。其可以实现数据纵向滚动,也可以实现横向滚动(ListView做不到横向滚动)

二.使用

1.利用RecyclerView做类似于快手app那种展示方式

首先要导入RecyclerView的依赖

implementation 'com.android.support:recyclerview-v7:28.0.0'//recyclerview

在布局中直接引用即可

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v7.widget.RecyclerView>
</LinearLayout>

RecyclerView有自己的适配器
所以在创建适配器时,需要继承自RecyclerView.Adapter

使用时首先要创建ViewHolder继承自RecyclerView.ViewHolder
然后泛型添入自创建的ViewHolder

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private List<VideoEntity.ListBean> datas;
    private Context context;

    private MyItemClickLister myItemClickLister;

    public MyAdapter(List<VideoEntity.ListBean> datas, Context context) {
        this.datas = datas;
        this.context = context;
        this.layoutInflater = LayoutInflater.from(context);
    }

    private LayoutInflater layoutInflater;

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = layoutInflater.inflate(R.layout.item, null);
        return new MyViewHolder(view);
    }

    public void setMyItemClickLister(MyItemClickLister myItemClickLister) {
        this.myItemClickLister = myItemClickLister;
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, final int i) {
        myViewHolder.teShow.setText(datas.get(i).getText());
        Glide.with(context)
                .load(datas.get(i).getImage1())
                .transform(new CenterCrop())
                .into(myViewHolder.imgShow);

        myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myItemClickLister.OnItemClick(i);
            }
        });
    }

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

    class MyViewHolder extends RecyclerView.ViewHolder {
        private ImageView imgShow;
        private TextView teShow;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            imgShow = itemView.findViewById(R.id.img_show);
            teShow = itemView.findViewById(R.id.te_show);
        }
    }
}

用来回调的接口

public interface MyItemClickLister {
    void OnItemClick(int position);
}

展示的Activity

public class MainActivity extends AppCompatActivity {
    private RecyclerView rv;
    private List<VideoEntity.ListBean> datas = new ArrayList<>();

    private String url = "http://api.budejie.com/api/api_open.php?a=list&c=data&type=41&page=1";

    private MyAdapter myAdapter;

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

        initViews();
        initDatas();
    }

    private void initDatas() {
        OkGo.<String>get(url)
                .headers("User-Agent", "PostmanRuntime/7.23.0")//添加请求头
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(Response<String> response) {
                        List<VideoEntity.ListBean> list = new Gson().fromJson(response.body(), VideoEntity.class).getList();
                        datas.addAll(list);
                        myAdapter.notifyDataSetChanged();
                    }
                });

    }

    private void initViews() {
        rv = (RecyclerView) findViewById(R.id.rv);
        myAdapter = new MyAdapter(datas, this);

        rv.setAdapter(myAdapter);


        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);//线性
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);//网格
        StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
        rv.setLayoutManager(staggeredGridLayoutManager);//设置显示模式

        myAdapter.setMyItemClickLister(new MyItemClickLister() {
            @Override
            public void OnItemClick(int position) {
                VideoEntity.ListBean bean = datas.get(position);
                Intent intent = new Intent(MainActivity.this, VideoActivity.class);
                intent.putExtra("url", bean.getVideouri());
                startActivity(intent);
            }
        });
    }
}

播放视频的Activity

public class VideoActivity extends AppCompatActivity {
    private VideoView vv;

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


        initViews();
    }

    private void initViews() {
        vv = (VideoView) findViewById(R.id.vv);



        String url = getIntent().getStringExtra("url");
        vv.setVideoPath(url);
        vv.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                vv.start();
            }
        });

    }
}

效果展示

2.利用RecyclerView做类似于购物车的展示

适配器

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private ArrayList<DishEntity.DataBean> list;
    private Context context;
    private MyListener myListener;

    public MyAdapter(ArrayList<DishEntity.DataBean> list, Context context) {
        this.list = list;
        this.context = context;
    }

    public MyListener getMyListener() {
        return myListener;
    }

    public void setMyListener(MyListener myListener) {
        this.myListener = myListener;
    }

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

    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, final int position) {
        holder.tv_title.setText(list.get(position).getTitle() + "");
        holder.tv_price.setText(list.get(position).getCollect_num() + "");
        Glide.with(context)
                .load(list.get(position).getPic())
                .transform(new CenterCrop())//居中裁剪
                .into(holder.iv);

        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                list.get(position).setChecked(b);
                count();
            }
        });
        holder.iv_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //更新item的数量
                int checkNum = list.get(position).getCheckNum();
                checkNum++;
                list.get(position).setCheckNum(checkNum);
                holder.tv_num.setText(checkNum + "");
                count();
            }
        });
        holder.iv_jian.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //更新item的数量
                int checkNum = list.get(position).getCheckNum();
                if (checkNum > 0) {
                    checkNum--;
                    list.get(position).setCheckNum(checkNum);
                    holder.tv_num.setText(checkNum + "");
                    count();
                }

            }
        });
    }

    //计算总价: 选中:单价*选中数量   未选中:不算
    public void count() {
        float count = 0;
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).isChecked()) {//选中
                float price = Float.parseFloat(list.get(i).getCollect_num());
                int checkNum = list.get(i).getCheckNum();
                count += price * checkNum;
            }
        }

        if (myListener!=null){
            myListener.onCount(count);
        }

    }


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

    class MyViewHolder extends RecyclerView.ViewHolder {
        ImageView iv, iv_add, iv_jian, iv_delete;//加号 减号 删除
        TextView tv_title, tv_num, tv_price;//介绍 数量 单价
        CheckBox checkBox;


        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            tv_title = itemView.findViewById(R.id.tv_title);
            tv_num = itemView.findViewById(R.id.tv_num);
            tv_price = itemView.findViewById(R.id.tv_price);


            iv = itemView.findViewById(R.id.iv);
            iv_add = itemView.findViewById(R.id.iv_add);
            iv_jian = itemView.findViewById(R.id.iv_jian);
            iv_delete = itemView.findViewById(R.id.iv_delete);

            checkBox = itemView.findViewById(R.id.cb);

        }
    }
}

回调的接口

public interface MyListener {
    void onCount(float count);
}

Activity

public class MainActivity extends AppCompatActivity {
    private String url = "http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1";
    private ArrayList<DishEntity.DataBean> list = new ArrayList<>();
    private MyAdapter myadapter;
    private RecyclerView recyclerView;
    private CheckBox cbAll;

    private TextView countPrice;

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

    private void initData() {
        OkGo.<String>get(url)
                .execute(new StringCallback() {
                    @Override
                    public void onSuccess(Response<String> response) {
                        String body = response.body();
                        List<DishEntity.DataBean> data = new Gson().fromJson(body, DishEntity.class).getData();
                        list.addAll(data);
                        myadapter.notifyDataSetChanged();

                    }
                });

    }

    private void initView() {
        recyclerView = findViewById(R.id.rv);
        countPrice = findViewById(R.id.tv_count);

        cbAll = (CheckBox) findViewById(R.id.cb_all);


        myadapter = new MyAdapter(list, this);
        recyclerView.setAdapter(myadapter);
        //设置布局方式
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        //设置分割线
        recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));

        myadapter.setMyListener(new MyListener() {
            @Override
            public void onCount(float count) {
                countPrice.setText("¥" + count);
            }
        });

        cbAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                for (int i = 0; i < recyclerView.getChildCount(); i++) {
                    View view = recyclerView.getChildAt(i);
                    CheckBox cb = view.findViewById(R.id.cb);
                    cb.setChecked(isChecked);
                }
            }
        });
    }
}

要开心加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值