Android Studio小笔记(5) - ListView于ArrayAdapter

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>

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值