Main<span style="font-family: Arial, Helvetica, sans-serif;">Activity</span>.java
package nework02.liuyang.ui_sinablog; public class Fruit { <span style="white-space:pre"> </span>private String name; <span style="white-space:pre"> </span>private int imageId; <span style="white-space:pre"> </span>private String text; <span style="white-space:pre"> </span>private String time; <span style="white-space:pre"> </span>public Fruit(String name, int imageId, String text, String time) { <span style="white-space:pre"> </span>super(); <span style="white-space:pre"> </span>this.name = name; <span style="white-space:pre"> </span>this.imageId = imageId; <span style="white-space:pre"> </span>this.text = text; <span style="white-space:pre"> </span>this.time = time; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public String getName() { <span style="white-space:pre"> </span>return name; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public void setName(String name) { <span style="white-space:pre"> </span>this.name = name; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public int getImageId() { <span style="white-space:pre"> </span>return imageId; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public void setImageId(int imageId) { <span style="white-space:pre"> </span>this.imageId = imageId; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public String getText() { <span style="white-space:pre"> </span>return text; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public void setText(String text) { <span style="white-space:pre"> </span>this.text = text; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public String getTime() { <span style="white-space:pre"> </span>return time; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>public void setTime(String time) { <span style="white-space:pre"> </span>this.time = time; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> } <span style="font-family:Arial, Helvetica, sans-serif;"><span style="white-space: normal;"> </span></span>
package com.example.ui_listview01.adpater; import java.util.List; import android.content.Context; 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.TextView; import com.example.ui_listview01.R; import com.example.ui_listview01.model.Fruit; //存在问题:在FruitAdapter的getView()方法中每次都将布局重新加载了一遍,当ListView快速滚动的时候这就会成为性能的瓶颈 public class FruitAdapter extends ArrayAdapter<Fruit> { <span style="white-space:pre"> </span>private int resourceId; <span style="white-space:pre"> </span>public FruitAdapter(Context context, int textViewResourceId, <span style="white-space:pre"> </span>List<Fruit> data) { <span style="white-space:pre"> </span>super(context, textViewResourceId, data); <span style="white-space:pre"> </span>resourceId=textViewResourceId; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>// 这个方法在每个子项被滚动到屏幕内的时候会被调用 <span style="white-space:pre"> </span>@Override <span style="white-space:pre"> </span>public View getView(int position, View convertView, ViewGroup parent) { <span style="white-space:pre"> </span>Fruit fruit = getItem(position); <span style="white-space:pre"> </span>View view=LayoutInflater.from(getContext()).inflate(resourceId, null); <span style="white-space:pre"> </span>ImageView ivFruit=(ImageView) view.findViewById(R.id.ivFruit); <span style="white-space:pre"> </span>TextView tvFruit=(TextView) view.findViewById(R.id.tvFruit); <span style="white-space:pre"> </span>TextView textView=(TextView)view.findViewById(R.id.textView); <span style="white-space:pre"> </span>TextView textView2=(TextView)view.findViewById(R.id.textView2); <span style="white-space:pre"> </span>ivFruit.setImageResource(fruit.getImageId()); <span style="white-space:pre"> </span>tvFruit.setText(fruit.getName()); <span style="white-space:pre"> </span>textView.setText(fruit.getText()); <span style="white-space:pre"> </span>textView2.setText(fruit.getTime()); <span style="white-space:pre"> </span>return view; <span style="white-space:pre"> </span>}
package com.example.ui_listview01.adpater; 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 com.example.ui_listview01.R; import com.example.ui_listview01.model.Fruit; //存在问题:虽然现在已经不会再重复去加载布局,但是每次在getView()方法中还是会调用View的findViewById()方法来获取一次控件的实例。 public class FruitAdapterImprove1 extends ArrayAdapter { <span style="white-space:pre"> </span>private int resourceId; <span style="white-space:pre"> </span>public FruitAdapterImprove1(Context context, int textViewResourceId) { <span style="white-space:pre"> </span>super(context, textViewResourceId); <span style="white-space:pre"> </span>resourceId = textViewResourceId; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>// 这个方法在每个子项被滚动到屏幕内的时候会被调用 <span style="white-space:pre"> </span>//getView()方法中还有一个convertView参数,这个参数用于将之前加载好的布局进行缓存,以便之后可以进行重用 <span style="white-space:pre"> </span>@Override <span style="white-space:pre"> </span>public View getView(int position, View convertView, ViewGroup parent) { <span style="white-space:pre"> </span>Fruit fruit = (Fruit) getItem(position); <span style="white-space:pre"> </span>View view=null; <span style="white-space:pre"> </span>if(convertView==null) <span style="white-space:pre"> </span> view = LayoutInflater.from(getContext()).inflate(resourceId, null); <span style="white-space:pre"> </span>else <span style="white-space:pre"> </span> view=convertView; <span style="white-space:pre"> </span>ImageView fruitImage = (ImageView) view.findViewById(R.id.ivFruit); <span style="white-space:pre"> </span>TextView fruitName = (TextView) view.findViewById(R.id.tvFruit); <span style="white-space:pre"> </span>fruitImage.setImageResource(fruit.getImageId()); <span style="white-space:pre"> </span>fruitName.setText(fruit.getName()); <span style="white-space:pre"> </span>return view; <span style="white-space:pre"> </span>} }
package com.example.ui_listview01.adpater; 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 com.example.ui_listview01.R; import com.example.ui_listview01.model.Fruit; //我们新增了一个内部类ViewHolder,用于对控件的实例进行缓存。 //当convertView为空的时候,创建一个ViewHolder对象,并将控件的实例都存放在ViewHolder里,然后调用View的setTag()方法,将ViewHolder对象存储在View中。 //当convertView不为空的时候则调用View的getTag()方法,把ViewHolder重新取出。 //这样所有控件的实例都缓存在了ViewHolder里,就没有必要每次都通过findViewById()方法来获取控件实例了。 public class FruitAdapterImprove2 extends ArrayAdapter { <span style="white-space:pre"> </span>private int resourceId; <span style="white-space:pre"> </span>public FruitAdapterImprove2(Context context, int textViewResourceId) { <span style="white-space:pre"> </span>super(context, textViewResourceId); <span style="white-space:pre"> </span>resourceId = textViewResourceId; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>// 这个方法在每个子项被滚动到屏幕内的时候会被调用 <span style="white-space:pre"> </span>// getView()方法中还有一个convertView参数,这个参数用于将之前加载好的布局进行缓存,以便之后可以进行重用 <span style="white-space:pre"> </span>@Override <span style="white-space:pre"> </span>public View getView(int position, View convertView, ViewGroup parent) { <span style="white-space:pre"> </span>Fruit fruit = (Fruit) getItem(position); <span style="white-space:pre"> </span>View view = null; <span style="white-space:pre"> </span>ViewHolder viewHolder; <span style="white-space:pre"> </span>if (convertView == null) { <span style="white-space:pre"> </span>view = LayoutInflater.from(getContext()).inflate(resourceId, null); <span style="white-space:pre"> </span>viewHolder = new ViewHolder(); <span style="white-space:pre"> </span>viewHolder.ivFruit = (ImageView) view.findViewById(R.id.ivFruit); <span style="white-space:pre"> </span>viewHolder.tvFruit = (TextView) view.findViewById(R.id.tvFruit); <span style="white-space:pre"> </span>view.setTag(viewHolder); <span style="white-space:pre"> </span>} else { <span style="white-space:pre"> </span>view = convertView; <span style="white-space:pre"> </span>viewHolder = (ViewHolder) convertView.getTag(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>viewHolder.ivFruit.setImageResource(fruit.getImageId()); <span style="white-space:pre"> </span>viewHolder.tvFruit.setText(fruit.getName()); <span style="white-space:pre"> </span>return view; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>class ViewHolder { <span style="white-space:pre"> </span>ImageView ivFruit; <span style="white-space:pre"> </span>TextView tvFruit; <span style="white-space:pre"> </span>} }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231572.html原文链接:https://javaforall.net
