前面讲过ListView的基本建立这里就不多说了,而接下来要讲的适配器的自定义,用自定义adapter的最大好处就是可以优化ListView,从而节省手机内存的资源,来提升运行效率,提高用户的体验度;
自定义Adapter和其他几种适配器的比较:
名称 | 说明 |
---|---|
ArrayAdapter | 适用于简单的文字列表 |
SimpleAdapter | 适用于简单的图文混搭列表,但不适于应用较复杂的业务逻辑 |
自定义adapter | 最灵活的适配器,适用于绝大多数情况 |
下面的讲解以一个完整的例子来讲解,以ListView+adapter来了解适配器的自定义,建立,和使用;
创建两个布局文件XML
分别为
item.xml
activity_main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/qq"/>
RelativeLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants">
<ImageView
android:id="@+id/image"
android:src="@drawable/image1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginLeft="20dp"
android:layout_marginTop="5dp"
android:layout_weight="3">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginTop="2dp"
android:text="乱斗堂"
android:textColor="#130000"
android:textSize="18dp"/>
<TextView
android:id="@+id/size"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginLeft="5dp"
android:textColor="#93851f"
android:text="65M"
android:textSize="20dp"/>
LinearLayout>
<Button
android:layout_weight="1"
android:id="@+id/button"
android:background="@drawable/iteam_selector"
android:layout_marginTop="12dp"
android:layout_width="20dp"
android:layout_height="35dp"
android:text="下载"
android:textSize="20dp"/>
LinearLayout>
要继承BaseAdapter就要使用反射器LayoutInflater,
反射器在 实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。
不同点是LayoutInflater是用 来找res/layout/下的xml布局文件,并且实例化;
而findViewById()是找xml布局文件下的具体widget控件(如 Button、TextView等)。
反射器LayoutInflater具体作用: 对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
另外继承BaseAdapter这一父类就需要重写其4个方法:
上面介绍完反射器,下面我们写自定义Adapter的java文件:
public class MyAdapter extends BaseAdapter {
//建立一个List容器来放置数据源
private List
public class MainActivity extends AppCompatActivity {
ListView listview;
List<Map<String, Object>> data = new ArrayList<>();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取ListView对象
listview = (ListView) findViewById(R.id.qq);
//准备数据源
//添加到listview第一个行列表
Map<String, Object> map = new HashMap<String, Object>();
map.put("image", R.drawable.image1);
map.put("name", "斗地主");
map.put("size", "30M");
map.put("button", "下载");
data.add(map);
//添加到listview第二个行列表
Map<String, Object> map1 = new HashMap<String, Object>();
map1 = new HashMap<String, Object>();
map1.put("image", R.drawable.image2);
map1.put("name", "乱斗堂");
map1.put("size", "30M");
map1.put("button", "下载");
data.add(map1);
//添加到listview第三个行列表
Map<String, Object> map2 = new HashMap<String, Object>();
map2 = new HashMap<String, Object>();
map2.put("image", R.drawable.image3);
map2.put("name", "大逃亡");
map2.put("size", "40M");
map2.put("button", "下载");
data.add(map2);
MyAdapter adapter = new MyAdapter(this);
adapter.setList(data);
listview.setAdapter(adapter);
}
}
结果:(里面的图片资源自己设定)