• ListView控件学习


    1、在布局中加入ListView

    <?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"
        android:orientation="vertical" >
        
        <ListView 
            android:id="@+id/list_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            
        </ListView>
    
    </LinearLayout>

    2、一个ListView的创建需要3个元素

    1. ListView中的每一列的View。
    2. 填入View的数据或者图片等。
    3. 连接数据与ListView的适配器。
          private String[]data={
                "Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry","Mango"
          };
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
               
               ArrayAdapter<String> adapter=new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);
                ListView listView=(ListView) findViewById(R.id.list_view);
                listView.setAdapter(adapter);
            }

     2、定制ListView的界面

    首先定义一个实体类,作为ListView适配器的适配类型。

    package com.example.listviewtest;
    
    public class Fruit {
        private String name;//水果的名字
        private int imageId;//水果对应图片的资源id
        public Fruit(String name, int imageId) {
            this.name = name;
            this.imageId = imageId;
        }
        public String getName() {
            return name;
        }
        public int getImageId() {
            return imageId;
        }
        
    }

    2、为ListView的子项指定一个我们自定义的布局 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="wrap_content"
            android:layout_height="wrap_content"/>
        <TextView 
            android:id="@+id/fruit_name"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_gravity="center"
               android:layout_marginLeft="10dip"/>
    </LinearLayout>

    3、自定义一个适配器,这个适配器继承自ArrayAdapter,并指出泛型为Fruit类。

    在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是 LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具 体widget控件(如Button、TextView等)。
    具体作用:
    • 对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
    • 对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。
    LayoutInflater 是一个抽象类,在文档中如下声明:
    public abstract class LayoutInflater extends Object
    获得 LayoutInflater 实例的三种方式
    • LayoutInflater inflater = getLayoutInflater();//调用Activity的getLayoutInflater() 
    • LayoutInflater inflater = LayoutInflater.from(context);  
    • LayoutInflater inflater =  (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
    package com.example.listviewtest;
    
    import java.util.List;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    public class FruitAdapter extends ArrayAdapter<Fruit>{
        
        private int resourceID;
        public FruitAdapter(Context context,  int textViewResourceId,
                List<Fruit> objects) {
            super(context,  textViewResourceId, objects);
            // TODO Auto-generated constructor stub
            resourceID=textViewResourceId;
        }
        
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            Fruit fruit=getItem(position);
            View view=LayoutInflater.from(getContext()).inflate(resourceID, null);
            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;
        }
        
    }

    4、MainActivity

    package com.example.listviewtest;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    
    public class MainActivity extends Activity {
        
        private List<Fruit> fruitList=new ArrayList<Fruit>();
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initFruits();
            FruitAdapter adapter=new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
            ListView listView=(ListView) findViewById(R.id.list_view);
            listView.setAdapter(adapter);
        }
        private void initFruits() {
            Fruit apple = new Fruit("Apple", R.drawable.apple_pic);
            fruitList.add(apple);
            Fruit banana = new Fruit("Banana", R.drawable.banana_pic);
            fruitList.add(banana);
            Fruit orange = new Fruit("Orange", R.drawable.orange_pic);
            fruitList.add(orange);
            Fruit watermelon = new Fruit("Watermelon", R.drawable.watermelon_pic);
            fruitList.add(watermelon);
            Fruit pear = new Fruit("Pear", R.drawable.pear_pic);
            fruitList.add(pear);
            Fruit grape = new Fruit("Grape", R.drawable.grape_pic);
            fruitList.add(grape);
            Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic);
            fruitList.add(pineapple);
            Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic);
            fruitList.add(strawberry);
            Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic);
            fruitList.add(cherry);
            Fruit mango = new Fruit("Mango", R.drawable.mango_pic);
            fruitList.add(mango);
        }
        
    }

     5、提升ListView的运行效率

    FruitAdapter的getView()方法每次都将布局重新加载一遍,当ListView快速滚动的时候就会成为性能的瓶颈。getView()方法中还有一个convertView参数,这个参数用于将之前加载好的布局进行缓存,以便之后可以进行重用。viewHolder类就是一个持有者的类,他里面一般没有方法,只有属性,作用就是一个临时的储存器,把你getView方法中每次返回的View存起来,可以下次再用

    package com.example.listviewtest;
    
    import java.util.List;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    public class FruitAdapter extends ArrayAdapter<Fruit>{
        
        private int resourceID;
        public FruitAdapter(Context context,  int textViewResourceId,
                List<Fruit> objects) {
            super(context,  textViewResourceId, objects);
            // TODO Auto-generated constructor stub
            resourceID=textViewResourceId;
        }
        
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            Fruit fruit=getItem(position);
            View view;
            ViewHolder viewHolder;
            if(convertView==null){
             view=LayoutInflater.from(getContext()).inflate(resourceID, null);
             viewHolder=new ViewHolder();
             viewHolder.imageView=(ImageView) view.findViewById(R.id.fruit_image);
             viewHolder.textView=(TextView) view.findViewById(R.id.fruit_name);
             view.setTag(viewHolder);//将ViewHolder存储在view中
            }else{
                view=convertView;
                viewHolder=(ViewHolder) view.getTag();//重新获取ViewHolder
            }
            viewHolder.imageView.setImageResource(fruit.getImageId());
            viewHolder.textView.setText(fruit.getName());
            return view;
        }
        class ViewHolder{
            ImageView imageView;
            TextView textView;
        }
        
    }

     6、ListView的点击事件

            listView.setOnItemClickListener(new OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                        long id) {
                    Fruit fruit=fruitList.get(position);
                    Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show();
                    
                }
                
            });
  • 相关阅读:
    再谈TextField
    IOS-TextField知多少
    leftBarButtonItems
    LeftBarButtonItems,定制导航栏返回按钮
    Apple Mach-O Linker (id) Error "_OBJC_CLASS...错误解决办法 Apple Mach-O Linker (id) Error "_OBJC_CLASS...错误解决办法
    Unrecognized Selector Sent to Instance问题之诱敌深入关门打狗解决办法
    UNRECOGNIZED SELECTOR SENT TO INSTANCE 问题快速定位的方法
    Present ViewController,模态详解
    UILABEL AUTOLAYOUT自动换行 版本区别
    iOS自动布局解决警告Automatic Preferred Max Layout Width is not available on iOS versions prior to 8.0
  • 原文地址:https://www.cnblogs.com/lyjs/p/5266767.html
Copyright © 2020-2023  润新知