使用ListView自定义布局

作者: Dream城堡 | 来源:发表于2018-11-19 16:47 被阅读5次

    使用ListView自定义布局

    1.新建一个ListViewTest项目
    2.修改MainActivity:
    package com.example.listviewtest;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.text.AndroidCharacter;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    
    public class MainActivity extends AppCompatActivity {
    
        private String[] data = {
                "apple", "bannana", "pear", "orange",
                "apple", "bannana", "pear", "orange",
                "apple", "bannana", "pear", "orange",
                "apple", "bannana", "pear", "orange",
        };
    
    
        @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);
    
    
        }
    }
    
    
    3.修改activity_main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
    
    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
    </ListView>
    </LinearLayout>
    
    

    效果展示如下:

    image.png

    4.使用ListView

    新建一个类Fruit:

    package com.example.listviewtest;
    
    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 void setName(String name) {
            this.name = name;
        }
    
        public int getImageId() {
            return imageId;
        }
    
        public void setImageId(int imageId) {
            this.imageId = imageId;
        }
    }
    
    

    新建一个FruitAdapter:

    package com.example.listviewtest;
    
    import android.content.Context;
    import android.support.annotation.IdRes;
    import android.support.annotation.LayoutRes;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.text.Layout;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import java.util.List;
    
    
    public class FruitAdapter extends ArrayAdapter<Fruit> {
        private static final String TAG = "FruitAdapter";
    
    
        private  int resourceId;
        public FruitAdapter( Context context,
                             int textViewResourceId,
                             List<Fruit> objects) {
            super(context,textViewResourceId, objects);
            resourceId = textViewResourceId;
    
        }
    
    
        @NonNull
        @Override
        public View getView(int position,
                            @Nullable View convertView,
                            @NonNull ViewGroup parent) {
            Log.d(TAG, "position: "+position);
            Fruit fruit = getItem(position); //获取当前Fruit实例
            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_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"
        android:orientation="vertical">
    
        <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_vertical"
            android:layout_marginLeft="10dp"
            />
    </LinearLayout>
    

    MainActivity:

    package com.example.listviewtest;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.text.AndroidCharacter;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
        private List<Fruit> fruitList = new ArrayList<>();
        
        @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() {
    
    
            for (int i = 0; i <10 ; i++) {
    
                Fruit apple = new Fruit("apple",R.drawable.apple);
                fruitList.add(apple);
                Fruit orange = new Fruit("orange",R.drawable.orange);
                fruitList.add(orange);
    
    
    
            }
    
                    
        }
    }
    
    

    提升ListView的运行效率

    ListView这个控件实际上是很难用的,就是因为它很多细节可以优化,效率就是比较重要的一点.下面我们来优化下它的效率:

    FruitAdapter:

    package com.example.listviewtest;
    
    import android.content.Context;
    import android.support.annotation.IdRes;
    import android.support.annotation.LayoutRes;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.text.Layout;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import java.util.List;
    
    
    public class FruitAdapter extends ArrayAdapter<Fruit> {
        private static final String TAG = "FruitAdapter";
    
    
        private int resourceId;
    
        public FruitAdapter(Context context,
                            int textViewResourceId,
                            List<Fruit> objects) {
            super(context, textViewResourceId, objects);
            resourceId = textViewResourceId;
    
        }
    
    
        @NonNull
        @Override
        public View getView(int position,
                            @Nullable View convertView,
                            @NonNull ViewGroup parent) {
            Log.d(TAG, "position: " + position);
            Fruit fruit = getItem(position); //获取当前Fruit实例
            View view;
            ViewHolder viewHolder;
            if (convertView == null) {
                view = LayoutInflater.from(getContext()).inflate(
                        resourceId, parent, false
                );
    
                viewHolder = new ViewHolder();
    
                viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
                viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);
    
                view.setTag(viewHolder);//将viewHolder存储在view中
    
            } else {
                view = convertView;
                viewHolder = (ViewHolder) view.getTag();//重新获取viewHolder
            }
    
            viewHolder.fruitImage.setImageResource(fruit.getImageId());
            viewHolder.fruitName.setText(fruit.getName());
            return view;
        }
    
        class ViewHolder {
            ImageView fruitImage;
            TextView fruitName;
        }
    
    
    }
    
    

    这里对convertView进行重用,用viewHolder来取数据,提高了效率.

    ListView的点击事件

    修改MainActivity:

    package com.example.listviewtest;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.text.AndroidCharacter;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
        private List<Fruit> fruitList = new ArrayList<>();
    
        @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);
    
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent,
                                        View view,
                                        int position,
                                        long id) {
                    Fruit fruit = fruitList.get(position);
                    Toast.makeText(MainActivity.this,
    
                            fruit.getName(),
                            Toast.LENGTH_SHORT
                            ).show();
                }
            });
    
        }
    
        private void initFruits() {
    
            for (int i = 0; i <10 ; i++) {
    
                Fruit apple = new Fruit("apple",R.drawable.apple);
                fruitList.add(apple);
                Fruit orange = new Fruit("orange",R.drawable.orange);
                fruitList.add(orange);
    
            }
           
        }
    }
    

    相关文章

      网友评论

        本文标题:使用ListView自定义布局

        本文链接:https://www.haomeiwen.com/subject/kbmofqtx.html