首先新建一个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