Recycleview(一)
第二天正式入门android,还以为门槛刚迈进去,谁知道我连鞋都还没脱呢,第一次接触Recycleview,直接懵逼,写一些源代码以防自己忘记
第一步 新建一个包 —adapter
//适配器(我也不知道是不是叫适配器)
第二步 新建一个java类
具体生成的代码需要修改如下图
ListAdapter内的代码
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder>{
private final Context context;
private final ArrayList<String> strings;
private final LayoutInflater infalter;
public ListAdapter(Context context, ArrayList<String> strings){
this.context=context;
this.strings=strings;
infalter = LayoutInflater.from(context);
}
@NonNull
@Override
public ListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//一定将parent传入infalter中
return new ViewHolder(infalter.inflate(android.R.layout.simple_list_item_1,parent,false));
}
//将对应方法传入到viewholder
@Override
public void onBindViewHolder(@NonNull ListAdapter.ViewHolder holder, int position) {
holder.bindData(strings.get(position));
}
//显示多少条代码
@Override
public int getItemCount() {
return 100;
}
//
class ViewHolder extends RecyclerView.ViewHolder
{
private final TextView text1;
public ViewHolder(@NonNull View itemView) {
super(itemView);
text1= itemView.findViewById(android.R.id.text1);
}
public void bindData(String s) {
text1.setText(s);
}
}
}
细节过程
1. 在MainActivity中编写一个方法跳转到ListActivity
public void showimage(View view) {
Intent inter = new Intent(MainActivity.this, logActivity.class);
startActivity(inter);
}
2.在list.xml中编辑
更改布局为LinearLayout
在布局内添加RecycleView控件
<?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=".activity.listActivity">
//recyclerview控件添加
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rv" //id
></androidx.recyclerview.widget.RecyclerView>
</LinearLayout>
3 进入ListActivity编辑
布局管理器
RecyclerView rv= findViewById(R.id.rv);
//确定recycleview在使用期间不会改变
rv.setHasFixedSize(true);
//设置布局管理器,实现纵向还是横向布局
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
rv.setLayoutManager(linearLayoutManager);
setHasFixedSize(TRUE/FALSE) //当前Recycleview高度是不是固定的
4 设置适配器
4.1
新建一个ListAdapter具体方法为上第二步
4.2
修改代码为
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder>{}
在报错红线上按ALT+ENTER实现方法会产生需要实现的方法
4.3
@NonNull
@Override
public ListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//一定将parent传入infalter中
return NULL
}
//将对应方法传入到viewholder
@Override
public void onBindViewHolder(@NonNull ListAdapter.ViewHolder holder, int position) {
}
//显示多少条代码
@Override
public int getItemCount() {
return 0;
}
4.4
此时4.1中的方法泛型内还有viewHolder在报错,还没实现此方法
如果选择ALT+ENTER修复选择creat class "ViewHolder"选择创造此类,那么会在MainActivity创造出ViewHolder类,为了方便代码管理,我们就写在ListAdapter中
class ViewHolder extends RecyclerView.ViewHolder{}
4.5
上面代码肯定报错,按住ALT+ENTER选择Creat constructor matching super实现方法类中出现一下方法
public ViewHolder(@NonNull View itemView) {
super(itemView);
}
4.6在4.1下创造一个构造器
public ListAdapter(Context context, ArrayList<String> strings){
this.context=context;
this.strings=strings;
infalter = LayoutInflater.from(context);
}
4.7context,strings,inflater 报错,ALT+ENTER快速创建变量
private final Context context;
private final ArrayList<String> strings;
private final LayoutInflater infalter;
细节分析在4.3中自动生成的方法
onCreateViewHolder
public ListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//一定将parent传入infalter中
return new ViewHolder(infalter.inflate(android.R.layout.simple_list_item_1,parent,false));
}
onBindViewHolder
public void onBindViewHolder(@NonNull ListAdapter.ViewHolder holder, int position) {
holder.bindData(strings.get(position));
}
getItemCount
public int getItemCount() {
return strings.size();
}
实现class ViewHolder extends RecyclerView.ViewHolder类
class ViewHolder extends RecyclerView.ViewHolder
{
private final TextView text1;
public ViewHolder(@NonNull View itemView) {
super(itemView);
text1= itemView.findViewById(android.R.id.text1);
}
public void bindData(String s) {
text1.setText(s);
}
}