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
  • 相关阅读:
    vue代码调试
    在vscode中无法使用yarn
    js滚动条计算公式
    chrome插件制作-高级篇
    网站js注入实现自动输入账号密码
    String、StringBuffer和StringBuilder有什么区别?
    待重写
    http协议
    待重写
    java内存加载机制
  • 原文地址:https://www.cnblogs.com/cenzhongman/p/6031717.html
Copyright © 2011-2022 走看看