ListView用法及BaseAdapter详解
1.先上代码
布局部分:items.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/image" android:layout_width="100dp" android:layout_height="100dp" android:layout_margin="20dp" android:background="@color/black" android:src="@mipmap/ic_launcher" /> <LinearLayout android:layout_width="match_parent" android:layout_height="140dp" android:padding="20dp" android:orientation="vertical"> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="name:xxx" android:textSize="20dp"/> <TextView android:id="@+id/quote" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="quote:xxxxxxxxx" android:textSize="20dp"/> <TextView android:id="@+id/age" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="age:xx" android:textSize="20dp"/> </LinearLayout> </LinearLayout>
MainActivity部分
package com.example.exp; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.RecyclerView; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import org.w3c.dom.Text; public class MainActivity extends AppCompatActivity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView=findViewById(R.id.lv); String name[]=new String[]{"wcb","jl","gcf","pod"}; listView.setAdapter(new Mybaseadapter(getApplicationContext(),name)); } } class Mybaseadapter extends BaseAdapter{ private String[] data; private Context context; private LayoutInflater layoutInflater=null; public Mybaseadapter(Context context,String[] data) { super(); this.context=context; this.data=data; layoutInflater=LayoutInflater.from(context); } static class Viewholder{ public ImageView imageView; public TextView textView1,textView2,textView3; } @Override public int getCount() { return data.length; } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int positition, View view, ViewGroup viewGroup) { Viewholder viewholder=null; if(view ==null){ view=layoutInflater.inflate(R.layout.items,null); viewholder=new Viewholder(); viewholder.imageView=view.findViewById(R.id.image); viewholder.textView1=view.findViewById(R.id.name); viewholder.textView2=view.findViewById(R.id.quote); viewholder.textView3=view.findViewById(R.id.age); view.setTag(viewholder); }else { viewholder=(Viewholder)view.getTag(); } viewholder.imageView.setImageResource(R.mipmap.ic_launcher); viewholder.textView1.setText(data[position]); viewholder.textView2.setText("??????"); viewholder.textView3.setText("18"); return view; } }
2.BaseAdapter
baseadapter是适用于listview的适配器,使用其须重新实现4个方法,关键方法为getView(),ViewHolder类定义了listview中具体单元布局的模板
ListView中的每一个Item显示都需要Adapter调用一次getView的方法,这个方法会传入一个convertView的参数,返回的View就是这个Item显示的View。如果当Item的数量足够大,再为每一个Item都创建一个View对象,必将占用很多内存,创建View对象(Inflater.inflate(R.layout.lv_item, null);从xml中生成View,这是属于IO操作)也是耗时操作,所以必将影响性能。Android提供了一个叫做Recycler(反复循环器)的构件,就是当ListView的Item从上方滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从下方生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的Item的View,所以说如果能重用这个convertView,就会大大改善性能。
然后来看函数原型publicView getView(intposition, View convertView, ViewGroup parent),参数中position是指当前item在屏幕中的位置,convertView相当于缓存的作用。函数返回一个View作为ListView中一个item的布局。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理