一般情况下,使用了ListView控件基本都需要优化,不然会因为加载过多的Item并且快速滑动控件,界面就会出现卡顿现象。
直观点,用一个案例来对ListView控件进行数据适配来优化。
在res文件夹中创建一个名为drawable-hdpi的文件夹来存放需要用到的图片。
在activity_main.xml文件中放置界面控件
这个案例做的是一个商城,这个商城里面由若干个item组成,item里面需要图片和文字
所以创建一个名为list_item.xml的文件来布局一个item界面。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<ImageView
android:id="@+id/iv"
android:layout_width="120dp"
android:layout_height="90dp"
android:layout_centerVertical="true"
/>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/iv"
android:layout_centerVertical="true"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/title"
android:text="桌子"
android:textSize="20sp"
android:textColor="#000000"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_price"
android:text="价格"
android:textSize="20sp"
android:layout_marginTop="10dp"
android:layout_below="@+id/title"
android:textColor="#FF8F03"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/price"
android:text="1000"
android:textSize="20sp"
android:layout_below="@+id/title"
android:layout_toRightOf="@+id/tv_price"
android:textColor="#FF8F03"
android:layout_marginTop="10dp"
/>
</RelativeLayout>
</RelativeLayout>
在MainActivity.java文件中编写以下代码:
package com.example.whhhh;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.widget.ImageViewCompat;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private ListView mListView;
private String[] titles = {"桌子", "苹果", "蛋糕", "线衣","猕猴桃","围巾","西瓜","哈密瓜"};
private String[] prices = {"1800元", "10元/kg", "300元", "350" + "元","10元/kg","280元","10元","20元"};
private int[] icons = {R.drawable.table, R.drawable.apple, R.drawable.cake,
R.drawable.xianyi,R.drawable.mihoutao,R.drawable.weijin,R.drawable.xigua,R.drawable.hamigua};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.lv);
MyBaseAdapter mAdapter = new MyBaseAdapter();
mListView.setAdapter(mAdapter);
}
class MyBaseAdapter extends BaseAdapter{
@Override
public int getCount(){
return titles.length;
}
@Override
public Object getItem(int position){
return titles[position];
}
@Override
public long getItemId(int position){
return position;
}
@Override
public View getView(int position,View convertView,ViewGroup parent){
View view=View.inflate(MainActivity.this,R.layout.list_item,null);
TextView title=(TextView)view.findViewById(R.id.title);
TextView price=(TextView)view.findViewById(R.id.price);
ImageView iv=(ImageView) view.findViewById(R.id.iv);
title.setText(titles[position]);
price.setText(prices[position]);
iv.setBackgroundResource(icons[position]);
return view;
}}}
通过定义了数组titles、prices、icons这三个数组,来存储商品名称,价格和图片
通过setAdapter()方法给ListView控件设置适配器
创建MyBaseAdapter类继承BaseAdapter类,重写了一些方法得到商城最终的效果。
通过以上代码就可以看到,滑动屏幕会一直创建Item对象,能显示多少就创建多少,会过多的消耗资源
同时每创建一个Item对象就要初始化一遍控件,也会浪费大量的时间
所以需要一个容器来装载需要加载的控件,即创建一个ViewHolder类:
class ViewHolder{
TextView title,price;
ImageView iv;
}
然后,通过优化getView()方法来使当滑动ListView控件时,划出屏幕外的Item对象以缓存的形式存在:
ViewHolder holder=null;
if(convertView==null){
convertView=View.inflate(MainActivity.this,R.layout.list_item,null);
holder=new ViewHolder();
holder.title=(TextView)convertView.findViewById(R.id.title);
holder.price=(TextView)convertView.findViewById(R.id.price);
holder.iv=(ImageView)convertView.findViewById(R.id.iv);
convertView.setTag(holder);
}else{
holder=(ViewHolder)convertView.getTag();
}
holder.title.setText(titles[position]);
holder.price.setText(prices[position]);
holder.iv.setBackgroundResource(icons[position]);
return convertView;
以上方法做完即可完成对ListView控件的优化