用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
最终效果图:
标签:
安卓开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧