小牛的安卓笔记-----RecyclerView(一)

昨夜西风凋碧树,独上高楼,望尽天涯路。

今天有时间,想把一些东西都总结一下,在开发中经常的东西之一就是RecyclerView了,很多的APP都需要有列表,故今天先来说说RecyclerView一些常用的功能,一些不常用的知识点会在用到时再来总结。话不多说,接下来就是代码。老规矩,先看成果:

在这里插入图片描述

为了展示数据更方便,我们这里先写一个实体类,模仿新闻列表。代码如下:

public class News {
    private String title;
    private String content;
    private String time;
    public News(String title, String content, String time) {
        this.title = title;
        this.content = content;
        this.time = time;
    }
    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
}

使用这种实体类在解析JSON的时候经常用到,值得学习!这里我们虽然没有JSON数据,但还是用实体类更加方便。

接下来便是最重要的Adapter的编写,对数据的处理都是放在这个里面的,还有一些基本的逻辑也会在这里面展现,写好adapter非常重要!看代码!

/**
 * @author Liuwanli
 *
 * @Time:2020/7/18
 *
 * @Describle:
 * 1,这是一个RecyclerView的适配器,必须重写三个方法:onCreateViewHolder(),onBindViewHolder()以及->
 * getItemCount()
 * 2,onCreateViewHolder作用(返回ViewHolder):主要是创建ViewHolder,在需要展示item的时候回调。使用ViewHolder加载item的布局可以避免不必要的findViewByID操作,提高了性能。
 * 3,onBindViewHolder作用:展示数据时使用,若要为item添加点击事件,也请在此使用
 * 4,getItemCount作用:返回数据的数量,很好理解
 * 5,在调用此adapter的时候,一定要为该adapter设置一个LayoutManager,一共有三种:线性,网格型,瀑布型,绝大部分应用都是线性
 * 6,构造函数应该是public的
 * extends RecyclerView.Adapter<Myadapter.MyViewHolder> 不明白为什么,问一下
 *
 * @关于ViewHolder类的编写:
 * 1,使用public修饰
 * 2,初始化子项控件的工作全部在此类中完成
 *
 * @关于子Item的点击事件监听器:
 * 1,考虑使用接口实现,注意使用public修饰
 * 2,不要忘记定义一个监听器的私有变量并编写set方法
 * 3,直接使用viewHolder.(某个被点击的控件).setOnItemClickListener方法来调用事件监听器
 *
 **/

public class Myadapter extends RecyclerView.Adapter<Myadapter.MyViewHolder>{

    private Context context;
    private ArrayList<News> list;
    private OnItemClickListener onItemClickListener;

    public Myadapter(Context context, ArrayList<News> list) {
        this.context = context;
        this.list = list;
    }

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

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
        holder.titleTV.setText(list.get(position).getTitle());
        holder.timeTV.setText(list.get(position).getTime());
        holder.contentTV.setText(list.get(position).getContent());
        holder.linearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onItemClickListener.onItemClick(position);
            }
        });
    }


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

    //注意:一定要是public修饰
    public class MyViewHolder extends RecyclerView.ViewHolder{

        public TextView titleTV,timeTV,contentTV;
        public LinearLayout linearLayout;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);

            //初始化子布局的控件
            titleTV=itemView.findViewById(R.id.title);
            timeTV=itemView.findViewById(R.id.time);
            contentTV=itemView.findViewById(R.id.content);
            linearLayout=itemView.findViewById(R.id.lin);
        }
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener){
        this.onItemClickListener=onItemClickListener;
    }

    public interface OnItemClickListener{
        void onItemClick(int position);
    }
}

接下来的事情就比较简单了,请看Activity的代码:

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private ArrayList<News> newsList;
    private RecyclerView.LayoutManager manager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        recyclerView=findViewById(R.id.re1);
        manager=new LinearLayoutManager(this);
        recyclerView.setLayoutManager(manager);
        Myadapter myadapter=new Myadapter(MainActivity.this,newsList);
        recyclerView.setAdapter(myadapter);
        myadapter.setOnItemClickListener(new Myadapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                Toast.makeText(MainActivity.this, "You clicked "+newsList.get(position).getTitle(), Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void initData() {
        newsList=new ArrayList<>();
        for(int i=0;i<20;i++){
            News new1=new News("华为","华为发布了2019年可持续发展报告,阐述了公司过去              一年取得的可持续发展成果。","2020/7/21");
            News news2=new News("苹果","苹果公司是美国一家高科技公司。由史蒂夫·乔布斯、斯蒂夫·沃兹尼亚克和罗·韦恩(Ron Wayne)等人于1976年4月1日创立,","2020/7/22");
            News news3=new News("高通","高通(中文简称:高通公司、美国高通或美国高通公司)创立于1985年,总部设于美国加利福尼亚州圣迭戈市,35,400多名员工遍布全球  。","2020/7/23");
            News news4=new News("戴尔","戴尔(中国)有限公司,法定代表人:Chenhong Huang,注册资金:2680万美元","2020/7/24");
            newsList.add(new1);
            newsList.add(news2);
            newsList.add(news3);
            newsList.add(news4);
        }
    }
}

这些一般能够应对绝大部分有列表的功能了,其他更多的知识点也要慢慢学习!加油

猜你喜欢

转载自blog.csdn.net/cj19960617/article/details/107735124