Android自定义ListView及优化

首先新建一个Item的Layout,作为ListView的列表项的外观:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/fruit0"
        android:id="@+id/img"
        android:layout_weight="1" />

    <TextView
        android:text="TextView"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="5"
        android:layout_gravity="center"
        android:gravity="center"
        android:textSize="35sp"
        android:id="@+id/name" />
</LinearLayout>

新建Item.java管理ListView列表项的数据:

package com.example.admin.testproj;

public class Item {
    private String name;
    private int id;
    Item(int id,String name){
        this.id = id;
        this.name = name;
    }
    String getName(){
        return name;
    }
    int getId(){
        return id;
    }
}

新建ItemAdapter继承自ArrayAdapter作为ListView的adapter,重写他的getView函数返回渲染的列表项:

package com.example.admin.testproj;

import android.content.Context;
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 ItemAdapter extends ArrayAdapter<Item>{
    private int resId;
    ItemAdapter(Context context, int textViewResourceId, List<Item> obj){
        super(context,textViewResourceId,obj);
        resId = textViewResourceId;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        Item item = getItem(position);
        //convertView为缓存View,可以提高运行效率
        View view = convertView;
        if(view == null) {
            view = LayoutInflater.from(getContext()).inflate(resId, null);
        }
        ((ImageView)view.findViewById(R.id.img)).setImageResource(item.getId());
        ((TextView)view.findViewById(R.id.name)).setText(item.getName());
        return view;
    }
}

展示的Activity:

<?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:id="@+id/activity_custom_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.admin.testproj.CustomList">

    <com.example.admin.testproj.TitleLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/title">
    </com.example.admin.testproj.TitleLayout>

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/title"
        android:id="@+id/cusList" />

</RelativeLayout>

初始化Activity和ListView:

package com.example.admin.testproj;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class CustomList extends AppCompatActivity {
    private ArrayList<Item> list = new ArrayList<Item>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_list);
        list.add(new Item(R.drawable.fruit0,"Item0"));
        list.add(new Item(R.drawable.fruit1,"Item1"));
        list.add(new Item(R.drawable.fruit2,"Item2"));
        list.add(new Item(R.drawable.fruit3,"Item3"));
        list.add(new Item(R.drawable.fruit4,"Item4"));
        list.add(new Item(R.drawable.fruit5,"Item5"));
        list.add(new Item(R.drawable.fruit6,"Item6"));
        list.add(new Item(R.drawable.fruit7,"Item7"));
        list.add(new Item(R.drawable.fruit8,"Item8"));
        list.add(new Item(R.drawable.fruit9,"Item9"));
        list.add(new Item(R.drawable.fruit10,"Item10"));
        list.add(new Item(R.drawable.fruit0,"Item11"));
        list.add(new Item(R.drawable.fruit1,"Item12"));
        list.add(new Item(R.drawable.fruit2,"Item13"));
        list.add(new Item(R.drawable.fruit3,"Item14"));
        list.add(new Item(R.drawable.fruit4,"Item15"));
        list.add(new Item(R.drawable.fruit5,"Item16"));
        list.add(new Item(R.drawable.fruit6,"Item17"));
        list.add(new Item(R.drawable.fruit7,"Item18"));
        list.add(new Item(R.drawable.fruit8,"Item19"));
        list.add(new Item(R.drawable.fruit9,"Item20"));
        list.add(new Item(R.drawable.fruit10,"Item21"));
        ItemAdapter adapter = new ItemAdapter(CustomList.this,R.layout.item,list);
        ListView cusList = (ListView)findViewById(R.id.cusList);
        cusList.setAdapter(adapter);
        //列表项点击事件
        cusList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(CustomList.this,"点击了:" + list.get(i).getName(),Toast.LENGTH_SHORT).show();
            }
        });
    }
}
  • 总结:
    1.创建列表项Item的展示Layout和数据管理类;
    2.新建ItemAdapter继承自ArrayAdapter作为ListView的adapter,重写他的getView函数,该函数使用Item记录的数据和类初始化时记录的资源Id初始化并渲染列表项;
    3.在Activity中初始化一个项为Item的ArrayList,初始化ItemAdapter,初始化ListView。

  • 效果:
    在这里插入图片描述

  • ListView优化一:ItemAdapter::getView中提升效率:

//convertView为缓存View,可以提高运行效率
View view = convertView;
if(view == null) {
    view = LayoutInflater.from(getContext()).inflate(resId, null);
}
  • ListView优化二:使用ViewHolder记录数据:
package com.example.admin.testproj;

import android.content.Context;
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 ItemAdapter extends ArrayAdapter<Item>{
    private int resId;
    ItemAdapter(Context context, int textViewResourceId, List<Item> obj){
        super(context,textViewResourceId,obj);
        resId = textViewResourceId;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        Item item = getItem(position);
        //convertView为缓存View,可以提高运行效率
        View view = convertView;
        ViewHolder holer;
        if(view == null) {
            view = LayoutInflater.from(getContext()).inflate(resId, null);
            holer = new ViewHolder();
            holer.view = (ImageView) view.findViewById(R.id.img);
            holer.text = (TextView) view.findViewById(R.id.name);
            view.setTag(holer);
        }else {
            holer = (ViewHolder)view.getTag();
        }
        holer.view.setImageResource(item.getId());
        holer.text.setText(item.getName());
        return view;
    }
    class ViewHolder{
        ImageView view;
        TextView text;
    }
}

代码:https://github.com/yangyang0312/AndroidTestCode/tree/master/TestProj

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值