ListView用法及BaseAdapter详解

1.先上代码

布局部分:items.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/image"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_margin="20dp"
        android:background="@color/black"
        android:src="@mipmap/ic_launcher"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="140dp"
        android:padding="20dp"
        android:orientation="vertical">
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="name:xxx"
            android:textSize="20dp"/>
        <TextView
            android:id="@+id/quote"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="quote:xxxxxxxxx"
            android:textSize="20dp"/>
        <TextView
            android:id="@+id/age"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="age:xx"
            android:textSize="20dp"/>


    </LinearLayout>
</LinearLayout>

MainActivity部分

 package com.example.exp;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import org.w3c.dom.Text;

 public class MainActivity extends AppCompatActivity {
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView=findViewById(R.id.lv);
        String name[]=new String[]{"wcb","jl","gcf","pod"};
        listView.setAdapter(new Mybaseadapter(getApplicationContext(),name));



    }
}

class Mybaseadapter extends BaseAdapter{
     private String[] data;
     private Context context;
     private LayoutInflater layoutInflater=null;
    public Mybaseadapter(Context context,String[] data) {
        super();
        this.context=context;
        this.data=data;
        layoutInflater=LayoutInflater.from(context);
    }
    static class Viewholder{
        public ImageView imageView;
        public TextView textView1,textView2,textView3;
    }

    @Override
    public int getCount() {
        return data.length;
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int positition, View view, ViewGroup viewGroup) {
        Viewholder viewholder=null;
        if(view ==null){
            view=layoutInflater.inflate(R.layout.items,null);
            viewholder=new Viewholder();
            viewholder.imageView=view.findViewById(R.id.image);
            viewholder.textView1=view.findViewById(R.id.name);
            viewholder.textView2=view.findViewById(R.id.quote);
            viewholder.textView3=view.findViewById(R.id.age);
            view.setTag(viewholder);

        }else {
            viewholder=(Viewholder)view.getTag();
        }
        viewholder.imageView.setImageResource(R.mipmap.ic_launcher);
        viewholder.textView1.setText(data[position]);
        viewholder.textView2.setText("??????");
        viewholder.textView3.setText("18");
        return view;
    }
}

2.BaseAdapter

baseadapter是适用于listview的适配器,使用其须重新实现4个方法,关键方法为getView(),ViewHolder类定义了listview中具体单元布局的模板

ListView中的每一个Item显示都需要Adapter调用一次getView的方法,这个方法会传入一个convertView的参数,返回的View就是这个Item显示的View。如果当Item的数量足够大,再为每一个Item都创建一个View对象,必将占用很多内存,创建View对象(Inflater.inflate(R.layout.lv_item, null);从xml中生成View,这是属于IO操作)也是耗时操作,所以必将影响性能。Android提供了一个叫做Recycler(反复循环器)的构件,就是当ListView的Item从上方滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从下方生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的Item的View,所以说如果能重用这个convertView,就会大大改善性能。

然后来看函数原型publicView getView(intposition, View convertView, ViewGroup parent),参数中position是指当前item在屏幕中的位置,convertView相当于缓存的作用。函数返回一个View作为ListView中一个item的布局。

posted @ 2022-12-24 20:29  chuimber  阅读(105)  评论(0)    收藏  举报