小牛的安卓笔记-----RecyclerView(一)
程序员文章站
2024-03-21 23:10:52
...
昨夜西风凋碧树,独上高楼,望尽天涯路。
今天有时间,想把一些东西都总结一下,在开发中经常的东西之一就是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);
}
}
}
这些一般能够应对绝大部分有列表的功能了,其他更多的知识点也要慢慢学习!加油