ListView用例

ListView 使用思路

  • 在要使用的 layoutview 中添加 ListView 控件
  • 如果子视图复杂,则写一个 itemView 的 layout 界面
  • 封装数据对象 DataBean
  • 实现合适的 Adapter
  • 实例化 ListView 对象,拿到数据集,设置 Adapter

ListView 三层代码优化

ListView 的代码优化主要是 getView() 方法中对 view 的复用

  • 不优化

        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            TestBean testBean = arrayList.get(position);
            View view = LayoutInflater.from(mContext).inflate(resourceId,parent,false);
            ImageView imgHead = view.findViewById(R.id.iv_head);
            TextView tvContent = view.findViewById(R.id.tv_content);
            imgHead.setImageResource(testBean.getImgId());
            tvContent.setText(testBean.getName());
            return view;
        }
    
  • 利用 convertView 缓存参数,复用布局

        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            TestBean testBean = arrayList.get(position);
            View view
            if(convertView !=null){
                view = convertView;
            }else {
                view = LayoutInflater.from(mContext).inflate(resourceId,parent,false);
            }
            ImageView imgHead = view.findViewById(R.id.iv_head);
            TextView tvContent = view.findViewById(R.id.tv_content);
            imgHead.setImageResource(testBean.getImgId());
            tvContent.setText(testBean.getName());
            return view;
        }
    
  • 不仅复用布局,而且通过增加 ViewHolder 复用控件的实例

        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            TestBean testBean = arrayList.get(position);
            View view;
            ViewHolder viewHolder;
            if(convertView !=null){
                view = convertView;
                viewHolder = (ViewHolder) view.getTag();
            }else {
                view = LayoutInflater.from(mContext).inflate(resourceId,parent,false);
                viewHolder = new ViewHolder();
                viewHolder.imgView = view.findViewById(R.id.iv_head);
                viewHolder.textView = view.findViewById(R.id.tv_content);
                view.setTag(viewHolder);// 将 viewHolder 存储在 view 中
            }
            viewHolder.imgView.setImageResource(testBean.getImgId());
            viewHolder.textView.setText(testBean.getName());
            return view;
        }
    

代码效果图

这就是效果图

ListView 代码实现

  • MainActivity.java

    package com.demo.thorn.listviewdemo;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.ListView;
    import java.util.ArrayList;
    public class MainActivity extends AppCompatActivity {
    
        private int count = 1;
        private ListView mListView;
        private int imgs[] = {R.drawable.img1,R.drawable.img2,R.drawable.img3
                ,R.drawable.img4,R.drawable.img5,R.drawable.img6
                ,R.drawable.img7,R.drawable.img8,R.drawable.img9,R.drawable.img10};;
        private ArrayList<TestBean> arrayList;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
            initData();
        }
    
        private void initView() {
            mListView = findViewById(R.id.lv_show);
            arrayList = new ArrayList<>();
        }
    
        private void initData() {
            for(int i = 0;i<10;i++){
                TestBean testBean = new TestBean();
                testBean.setImgId(imgs[i]);
                testBean.setName("Content Here"+i);
                arrayList.add(testBean);
            }
            mListView.setAdapter(new MyListViewAdapter(this,R.layout.item_show,arrayList));
            mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                TestBean testBean = arrayList.get(i);
                Log.i("jin",testBean.getName());
            }
        });
        }
    }
    
  • TestBean.java

    package com.demo.thorn.listviewdemo;
    
    public class TestBean {
        private int imgId;
        private  String name;
    
        public int getImgId() {
            return imgId;
        }
    
        public void setImgId(int imgId) {
            this.imgId = imgId;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
  • MyListViewAdapter.java

    package com.demo.thorn.listviewdemo;
    
    import android.content.Context;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    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.ArrayList;
    import java.util.List;
    
    public class MyListViewAdapter extends ArrayAdapter<TestBean> {
    
        ArrayList<TestBean> arrayList;
        int resourceId;
        Context mContext;
    
        public MyListViewAdapter(@NonNull Context context, int resource, @NonNull List<TestBean> objects) {
            super(context, resource, objects);
            resourceId = resource;
            arrayList = (ArrayList<TestBean>) objects;
            mContext = context;
        }
    
        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            TestBean testBean = arrayList.get(position);
            View view;
            ViewHolder viewHolder;
            if(convertView !=null){
                view = convertView;
                viewHolder = (ViewHolder) view.getTag();
            }else {
                view = LayoutInflater.from(mContext).inflate(resourceId,parent,false);
                viewHolder = new ViewHolder();
                viewHolder.imgView = view.findViewById(R.id.iv_head);
                viewHolder.textView = view.findViewById(R.id.tv_content);
                view.setTag(viewHolder);// 将 viewHolder 存储在 view 中
            }
            viewHolder.imgView.setImageResource(testBean.getImgId());
            viewHolder.textView.setText(testBean.getName());
            return view;
        }
    }
    
  • layout_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.demo.thorn.listviewdemo.MainActivity">
    
    <ListView
        android:id="@+id/lv_show"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
    </RelativeLayout>
    
  • item_show.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="horizontal"
        android:padding="10dp">
    
        <ImageView
            android:id="@+id/iv_head"
            android:layout_width="100dp"
            android:layout_height="100dp" />
    
        <TextView
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="20dp"
            android:id="@+id/tv_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
    

猜你喜欢

转载自blog.csdn.net/baidu_33221362/article/details/80991823