用RecyclerView实现列表视图

RecyclerView能够灵活实现大数据集的展示,视图的复用管理比ListView更好,能够显示列表、网格、瀑布流等形式,且不同的ViewHolder能够实现item多元化的功能。但是使用起来会稍微麻烦—点,并且没有类似ListView的onItemClickListener监听事件,需要开发者自己实现。

首先用RecyclerView实现列表视图I

建立RecyclerViewActivity.java文件:

复制代码
 1 public class RecyclerViewActivity extends AppCompatActivity {
 2     private Button BtnLinear;
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_recycler_view);//遇到R标红问题时import class就好了
 7         BtnLinear=findViewById(R.id.btn_linear);
 8         BtnLinear.setOnClickListener(new View.OnClickListener() {
 9             @Override
10             public void onClick(View view) {
11                 Intent intent=new Intent(RecyclerViewActivity.this,LinearRecyclerViewActivity.class);
12                 startActivity(intent);
13             }
14         });
15     }
16 }
复制代码

对应的activity_recycler_view.xml文件:

复制代码
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="wrap_content">
 4 
 5     <Button
 6         android:id="@+id/btn_linear"
 7         android:layout_width="match_parent"
 8         android:layout_height="wrap_content"
 9         android:text="列表视图">
10     </Button>
11 
12 </LinearLayout>
复制代码

建立LinearRecyclerViewActivity.java文件:

复制代码
 1 public class LinearRecyclerViewActivity extends AppCompatActivity {
 2     private RecyclerView RVmain;
 3     @Override
 4     protected void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_linear_recycler_view);
 7         RVmain=findViewById(R.id.rv_main);
 8         RVmain.setLayoutManager(new LinearLayoutManager(LinearRecyclerViewActivity.this));
 9         RVmain.addItemDecoration(new MyDecoration());//new了一个MyDecoration
10         RVmain.setAdapter(new LinearAdapter(LinearRecyclerViewActivity.this, new LinearAdapter.OnItemClickListener() {
11             @Override
12             public void onClick(int pos) {
13                 Toast.makeText(LinearRecyclerViewActivity.this, "click..."+pos, Toast.LENGTH_SHORT).show();
14             }
15         }));//第二种点击事件方法
16     }
17 
18     class MyDecoration extends RecyclerView.ItemDecoration{
19         @Override
20         public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
21             super.getItemOffsets(outRect, view, parent, state);
22             outRect.set(0,0,0,getResources().getDimensionPixelOffset(R.dimen.deviderHeight));
23         }//给列表视图在底部设置分隔线
24     }
25 }
复制代码

设置分割线需在values下创建一个dimens.xml文件:

1 <resources>
2     <dimen name="deviderHeight">1dp</dimen>
3 </resources>

 

对应的activity_linear_recycler_view.xml文件:

复制代码
 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="wrap_content">
 4 
 5     <androidx.recyclerview.widget.RecyclerView
 6         android:id="@+id/rv_main"
 7         android:layout_width="match_parent"
 8         android:layout_height="wrap_content"
 9         android:background="@color/greydrak"/>
10 </RelativeLayout>
复制代码

最后建立列表视图的适配器,LinearAdapter.java文件:

复制代码
 1 public class LinearAdapter extends RecyclerView.Adapter<LinearAdapter.LinearViewHolder>{
 2     private Context mcontext;
 3     private OnItemClickListener mlistener;
 4     public LinearAdapter(Context context,OnItemClickListener listener){
 5         this.mcontext=context;
 6         this.mlistener=listener;
 7     }
 8     @NonNull
 9     @Override
10     public LinearAdapter.LinearViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
11         return new LinearViewHolder(LayoutInflater.from(mcontext).inflate(R.layout.layout_linear_item,parent,false));
12     }//这里原来是RecyclerView.ViewHolder,建立完LinearViewHolder class后要把它改成LinearAdapter.LinearViewHolder就可以了
13 
14     @Override
15     public void onBindViewHolder(@NonNull LinearAdapter.LinearViewHolder holder,int position) {
16         holder.textView.setText("大家好,我又来了hiahia");
17         holder.itemView.setOnClickListener(new View.OnClickListener() {
18             @Override
19             public void onClick(View view) {
20                 //Toast.makeText(mcontext, "click...", Toast.LENGTH_SHORT).show();//第一种方法,如果加position的话就会标红,所以没加,具体原因还不知道
21                 mlistener.onClick(position);//第二种方法,反正点击事件没起作用,还是算了吧不弄了
22             }
23         });//增加点击事件,这是第一种方法
24     }//这里原来是RecyclerView.ViewHolder,建立完LinearViewHolder class后要把它改成LinearAdapter.LinearViewHolder就可以了
25 
26     @Override
27     public int getItemCount() {
28         return 20;
29     }//设置有多少行
30 
31     class LinearViewHolder extends RecyclerView.ViewHolder {
32         private TextView textView;
33         public LinearViewHolder(@NonNull View itemView) {
34             super(itemView);
35             textView=itemView.findViewById(R.id.tv_rtitle);
36         }
37     }
38     public interface OnItemClickListener{
39         void onClick(int pos);
40     }//点击事件的第二种方法,建立接口
41 }
复制代码

 

单个元素的样式为layout_linear_iteam.xml文件:

复制代码
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="wrap_content"
 4     android:orientation="vertical"
 5     android:background="@color/white">
 6 
 7     <TextView
 8         android:id="@+id/tv_rtitle"
 9         android:layout_width="match_parent"
10         android:layout_height="50dp"
11         android:gravity="center"
12         android:textColor="@color/black"
13         android:textSize="20sp"/>
14 </LinearLayout>
复制代码

最后注意xml文件中总布局的android:layout_height如果是match_parent的话达不到想要的效果,所以要给他改成wrap_content

最终效果图:

 

posted @   KongLong_cm  阅读(145)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示