欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-21 23:10:52
...

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

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

小牛的安卓笔记-----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);
        }
    }
}

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

相关标签: 安卓 android