zoukankan      html  css  js  c++  java
  • UI控件之ListView

    一,一个简单的TextView列表

    public class FirstActivity extends Activity {
        private String[] data = {"Apple", "Banana", "Orange", "Watermelon",
                "Pear", "Grape", "Pineapple", "Strawberry", "Cherry", "Mango","Apple", "Banana", "Orange", "Watermelon","Pear", "Grape", "Pineapple", "Strawberry", "Cherry", "Mango"};
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.first_layout);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(         //ArrayAdapter数组适配器
                    FirstActivity.this, android.R.layout.simple_list_item_1, data);
          //第一个参数,上下文对象;第二个参数,一个官方的内置布局的id(这是一个TexView);第三个参数,传入的数据
            ListView listView = (ListView) findViewById(R.id.ListView);
            listView.setAdapter(adapter);
        }
    }
    

    二,好玩的东西怎么可以只有Text View呢(来点复杂的)

    1.新建一个用于存放水果的类

    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;
        }
    }

    2.新建一个自定义的布局文件

    用于描述布局方式,等待被调用

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
    
        <ImageView
            android:id="@+id/fruit_image"
            android:layout_width="50dp"
            android:layout_height="50dp" />
    
        <TextView
            android:id="@+id/fruit_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
    

    3.自定义适配器,继承于ArrayAdapter,并重写getView方法

    public class FruitAdapter extends ArrayAdapter<Fruit> {      //泛型指定为Fruit类,就像String也是一个类
        private int resourceId;
        //新建FruitAdapter()方法,参数一:上下文对象;参数二:布局文件的ID;参数三:传入的数据
        public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects){
            super(context,textViewResourceId,objects);
            resourceId = textViewResourceId;
        }
    
        @NonNull
        @Override
        //重写getView() 方法,这个方法在内容被加载之前会执行
        public View getView(int position, View convertView, ViewGroup parent) {
            Fruit fruit = getItem(position);//得到方法传入的Fruit实例
            View view = LayoutInflater.from(getContext()).inflate(resourceId,null);//把构造器获取的id值传入view
    
            /*ListView的赋值*/
            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;
        }
    }

    注:在setText的时候不能用int类型数据。

    4.在Activity引用的layout中添加<ListView>

        <ListView
            android:id="@+id/ListView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
        </ListView>

    5.在Activity中初始化数据并引用ListView

    public class FirstActivity extends Activity {
        private List<Fruit> fruitList = new ArrayList<Fruit>();         //创建数组适配器的对象fruitList,范型为<Fruit类>
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.first_layout);
            initFruits();                                           //调用数据初始化函数
            FruitAdapter adapter = new FruitAdapter(FirstActivity.this,R.layout.fruit_item,fruitList);
            //对应的三个参数,上下文,id,适配器数据
    
            /*对ListView设置自定义适配器的值*/
            ListView listView = (ListView) findViewById(R.id.ListView);
            listView.setAdapter(adapter);
        }
    
        /*列表参数的值的传入和列表的添加*/
        private void initFruits(){
            Fruit apple = new Fruit("Apple",R.drawable.apple);
            fruitList.add(apple);//一定记得要把对象添加进列表中
            Fruit banana = new Fruit("banana",R.drawable.banane);
            fruitList.add(banana);
            Fruit grape = new Fruit("grape",R.drawable.grape);
            fruitList.add(grape);
            Fruit pear = new Fruit("pear",R.drawable.pear);
            fruitList.add(pear);
            Fruit watermelon = new Fruit("watermelon",R.drawable.watermelon);
            fruitList.add(watermelon);
            Fruit orange = new Fruit("orange",R.drawable.orange);
            fruitList.add(orange);
        }
    }

     二,ListView之优化

    1:控件重用,减少重复加载

    public View getView(int position, View convertView, ViewGroup parent) {
            Music music = getItem(position);
            View view;
            if (convertView == null) {
                //对应getView中的参数coverView,一个加载缓存布局的参数。如果没有加载好的布局,则使用LayoutInflater进行布局加载
                view = LayoutInflater.from(getContext()).inflate(ResourceId, null);
            }else {
                view = convertView;//存在布局,则重载布局
            }

    2:虽然解决了加载次数,但仍旧每次加载都findViewById

    ViewHolder在As加载中出现问题,暂未解决,后续更新优化问题,再研究研究。

    三,添加点击事件,为ListView 添加setOnItemClickListener

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    MainList APP = mainList.get(position);//确定点击位置,返回值为点击类的的对象
                    if (APP.getImageId() == R.drawable.list_view_icon) {
                        Intent intent = new Intent(MainActivity.this,MyListView.class);
                        startActivity(intent);
                    }
                }
            });
    岑忠满的博客新站点 https://cenzm.xyz
  • 相关阅读:
    WRF WPS预处理
    CVS安装
    Linux窗口最小化消失,任务栏上无法找到的解决方法
    NCARG安装配置出现error while loading shared libraries: libg2c.so.0问题额解决办法
    Netcdf安装
    Embedding R-generated Interactive HTML pages in MS PowerPoint(转)
    The leaflet package for online mapping in R(转)
    Some 3D Graphics (rgl) for Classification with Splines and Logistic Regression (from The Elements of Statistical Learning)(转)
    What does a Bayes factor feel like?(转)
    Weka算法介绍
  • 原文地址:https://www.cnblogs.com/cenzhongman/p/6031717.html
Copyright © 2011-2022 走看看