ListView优化
1. convertView 复用
2. ViewHolder 避免每次 findViewById
3. 图片三级缓存
4. 分页加载数据显示
class MyAdapter extends BaseAdapter {
//返回集合数据的数量
@Override
public int getCount() {
Log.e("TAG", "getCount()");
return data.size();
}
//返回指定下标对应的数据对象
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//Log.e("TAG", "getView() position="+position+" convertView="+convertView);
//1. 创建或得到对应当前行的一个ViewHolder对象
ViewHolder holder = null;
if(convertView==null) {
Log.e("TAG", "getView() "+position);
holder = new ViewHolder();
convertView = View.inflate(MainActivity.this, R.layout.item_simple_adapter, null);
holder.imageView = (ImageView) convertView.findViewById(R.id.iv_item_icon);
holder.nameTV = (TextView) convertView.findViewById(R.id.tv_item_name);
holder.priceTV = (TextView) convertView.findViewById(R.id.tv_item_content);
//将holder对象保存到convertView上
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//2. 得到当前行的数据对象
ShopInfo shopInfo = data.get(position);
//3. 给ViewHolder对象的视图设置数据
holder.imageView.setImageResource(shopInfo.getIcon());
holder.nameTV.setText(shopInfo.getName());
holder.priceTV.setText(shopInfo.getContent());
return convertView;
}
class ViewHolder {//视图的容器类
public ImageView imageView;
public TextView nameTV;
public TextView priceTV;
}
}
ListView 多个不同类型Item 适配器使用:
package com.terry.AudioFx;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
ListView mylistview;
List<String> list=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i=0;i<100;i++){
list.add("i:"+i);
}
mylistview = findViewById(R.id.mylistview);
mylistview.setAdapter(new MyAdapter());
}
class MyAdapter extends BaseAdapter {
//返回集合数据的数量
@Override
public int getCount() {
return list.size();
}
//返回指定下标对应的数据对象
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder1 viewHolder1=null;
ViewHolder2 viewHolder2=null;
int type= getItemViewType(position);
// 实例化 converView
if(convertView==null){
switch (type) {
case Item_Type1:
convertView = View.inflate(MainActivity.this,R.layout.item_simple_adapter,null);
viewHolder1= new ViewHolder1();
viewHolder1.tv_item_tv= convertView.findViewById(R.id.tv_item_tv);
convertView.setTag(viewHolder1);
break;
case Item_Type2:
convertView = View.inflate(MainActivity.this,R.layout.item_simple_adapter2,null);
viewHolder2=new ViewHolder2();
viewHolder2.tv_item_btn= convertView.findViewById(R.id.tv_item_btn);
convertView.setTag(viewHolder2);
break;
}
}else{
//获取复用converView
switch (type){
case Item_Type1:
viewHolder1= (ViewHolder1) convertView.getTag();
break;
case Item_Type2:
viewHolder2= (ViewHolder2) convertView.getTag();
break;
}
}
// 对应不同类型converView进行赋值
Log.e("denganzhi1",type+"");
switch (type) {
case Item_Type1:
viewHolder1.tv_item_tv.setText("item1:"+position);
break;
case Item_Type2:
viewHolder2.tv_item_btn.setText("item1"+ position);
break;
}
return convertView;
}
@Override
public int getViewTypeCount() {
return 2;
}
// 这类item_type1必须是要从0开始
public final int Item_Type1=0;
public final int Item_Type2=1;
@Override
public int getItemViewType(int position) {
if(position%2==0){
return Item_Type2;
}else {
return Item_Type1;
}
// return super.getItemViewType(position);
}
}
static class ViewHolder1 {
public TextView tv_item_tv;
}
static class ViewHolder2 {
public Button tv_item_btn;
}
}
item_simple_adapter.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">
<TextView
android:id="@+id/tv_item_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="hello"/>
</LinearLayout>
item_simple_adapter2.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">
<Button
android:id="@+id/tv_item_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="hello"/>
</LinearLayout>
activity_main.xml
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.terry.AudioFx.MainActivity">
<ListView
android:id="@+id/mylistview"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>