MainActivity.java
public class MainActivity extends AppCompatActivity {
/* private String[] data = {"apple","pear","pineapple","strawberry","bayberry","apple","pear","pineapple",
"strawberry","bayberry","apple","pear","pineapple","strawberry","bayberry"};*/
private List<Fruit> fruitList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建ArrayAdapter实例
//系统提供给我们的listview模板:
//R.layout.simple_list_item_1: 单独一行的文本框
//simple_list_item_2 : 两个文本框组成
//simple_list_item_checked : 每项都是由一个已选中的列表项
//simple_list_item_multiple_choice : 都带有一个复选框
//simple_list_item_single_choice : 都带有一个单选钮
// ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);
// 设置ListView的适配器。
/*
* ArrayAdapter构造方法中的参数:
* 参数一:当前上下文路径,即要在哪个Activity中显示。
* 参数二:布局文件的ID。这里使用的是系统提供的
* 。这个布局文件与一般的布局文件不同,ArrayAdapter中,只接收有一个TextView的布局文件
* ,如R.layout.list_item。
* 参数三:要显示的数据集合。在重载的构造方法中:第三个参数还可以是一个数组。
*/
FruitAdaptor adapter = new FruitAdaptor(MainActivity.this, R.layout.fruit_item, fruitList);
initFruits();//初始化水果数据
ListView listView = findViewById(R.id.listview_item);
listView.setAdapter(adapter); // 将适配器注册给listView
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
/*
* 参数一:当前点击的item所在的父控件
* 参数二:当前所点击的那个item对象
* 参数三:所点击的位置。
* */
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Fruit fruit = fruitList.get(i);
Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show();
}
});
}
private void initFruits(){
for(int i=0;i<4;i++){
Fruit apple = new Fruit("Apple", R.drawable.apple);
fruitList.add(apple);
Fruit bayberry = new Fruit("Bayberry", R.drawable.bayberry);
fruitList.add(bayberry);
Fruit pear = new Fruit("Pear", R.drawable.pear);
fruitList.add(pear);
Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple);
fruitList.add(pineapple);
Fruit strawberry = new Fruit("Strawberry",R.drawable.strawberry);
fruitList.add(strawberry);
}
}
}
重写getView之ArrayAdapter
public class FruitAdaptor extends ArrayAdapter<Fruit>
{
private int resourceID;
public FruitAdaptor(Context context,
int textViewResourceId,
List<Fruit> object)
{
super(context,textViewResourceId,object);
//保存参数
resourceID = textViewResourceId;
}
/*
getView()方法通常有以下四个参数:
position:当前项在适配器中的位置。这是一个整型值,通常是基于0的索引。对于ArrayAdapter,这个值从0开始,一直到数据集的长度减1。
convertView:这是一个视图对象,之前已经被使用过并且被回收,现在再次被使用。这个参数可以帮助优化列表的渲染,因为它减少了不必要的视图对象的创建和销毁。
这是一个重要的优化,特别是在移动设备上,因为它可以减少CPU和内存的使用。
parent:这是包含这个列表项视图的父视图对象。通常它是一个ListView或者其他的列表视图对象。
适应:这是一个RecyclerView的实例,它包含了所有的列表项视图。在RecyclerView中使用时,这个参数是必需的。而在标准的ListView中,这个参数通常是null。
*/
public View getView(int position, View coverView, ViewGroup parent){
Fruit fruit = getItem(position); //获取当前Fruit实例
/*
inflate(int resource, ViewGroup root, boolean attachToRoot):它在Android系统中主要用于从XML布局文件中创建视图(View)或布局(ViewGroup).
resource:一个资源ID,指向你想要加载的XML布局文件。这个文件定义了一个或多个视图或布局,并描述了它们之间的关系和样式。
root:一个ViewGroup对象,新创建的视图将被添加到这个ViewGroup中。如果你把attachToRoot参数设为false,那么新创建的视图将不会被添加到任何地方,你可能需要手动添加它。
attachToRoot:一个布尔值,决定新创建的视图是否直接添加到root视图中。如果为true,新视图会被直接添加到root中。如果为false,新视图不会被直接添加到root,但你可以选择手动添加。
getContext(): 函数的作用就是获取到当前环境的上下文,使得我们可以根据这个上下文来动态地创建视图或者布局。
"Context"是一个非常重要的概念。它代表了应用程序环境的信息,比如应用程序的资源、类、以及应用程序级别的操作,比如启动活动、广播、接收意图等。
LayoutInflater.from(getContext()): 创建一个LayoutInflater的实例
*/
View view = LayoutInflater.from(getContext()).inflate(resourceID, parent, false);
ImageView fruitImage = (ImageView)view.findViewById(R.id.fruit_image);
TextView fruitName = (TextView)view.findViewById(R.id.fruit_name);
fruitImage.setImageResource(fruit.getImageID());
fruitName.setText(fruit.getName());
return view;
}
Fruit类:
public class Fruit {
private String name;
private int imageID;
public Fruit(String name, int imageID){
this.name = name;
this.imageID =imageID;
}
public String getName(){
return name;
}
public int getImageID(){
return imageID;
}
}
fruit_item.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/fruit_image"
android:layout_width="40dp"
android:layout_height="40dp"/>
<TextView
android:id="@+id/fruit_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:layout_marginLeft="10dp"/>
</LinearLayout>
activity_main.xml:
<?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=".MainActivity">
<ListView
android:id="@+id/listview_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>