Android 列表视图项在ArrayAdapter上混淆
我正在为我的Android 列表视图项在ArrayAdapter上混淆,android,Android,我正在为我的列表视图使用ArrayAdapter,在第一次所有内容都正确显示时,问题是当我滚动查看时,ListView很滞后。 因此,我通过使用ViewHolder找到了一个解决方案,最后我的ListView可以平滑地滚动,但有一个缺点,我的ListView上的项目混淆了 我怎样才能解决这个问题 下面是我的getView()方法,用于我的ArrayAdapter: public class VideoLocationAdapter extends ArrayAdapter<VideoLoc
列表视图使用ArrayAdapter
,在第一次所有内容都正确显示时,问题是当我滚动查看时,ListView
很滞后。
因此,我通过使用ViewHolder
找到了一个解决方案,最后我的ListView可以平滑地滚动,但有一个缺点,我的ListView
上的项目混淆了
我怎样才能解决这个问题
下面是我的getView()
方法,用于我的ArrayAdapter
:
public class VideoLocationAdapter extends ArrayAdapter<VideoLocationDB> {
public ImageLoader imageLoader;
ImageLoader loader = null;
public VideoLocationAdapter(Context context, int resource,
VideoLocationDB[] videoLocationDBs) {
super(context, resource, videoLocationDBs);
loader = new ImageLoader(context);
}
private LayoutInflater layoutInflator;
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
FeedViewHolder feedViewHolder;
if (convertView == null) {
convertView = LocationsListActivity.this.getLayoutInflater()
.inflate(R.layout.listitems, null, true);
feedViewHolder = new FeedViewHolder();
feedViewHolder.titleView = (TextView) convertView.findViewById(R.id.txt_title);
feedViewHolder.descView = (TextView) convertView.findViewById(R.id.txt_list_desc);
feedViewHolder.more = (TextView) convertView.findViewById(R.id.txt_more);
feedViewHolder.distanceView = (TextView) convertView.findViewById(R.id.txt_distance);
feedViewHolder.v = (ImageView) convertView.findViewById(R.id.image);
final VideoLocationDB vidLocation = videoLocationsDB[position];
// Image
String url = vidLocation.documentary_thumbnail_url;
String name = vidLocation.name;
feedViewHolder.v.setTag(url);
loader.DisplayImage(url, LocationsListActivity.this, feedViewHolder.v, name);
// Title
String title = vidLocation.name;
feedViewHolder.titleView.setText(title.toUpperCase());
Typeface fontRegular = Typeface.createFromAsset(getAssets(),
"miso.otf");
feedViewHolder.titleView.setTypeface(fontRegular);
// Description
String desc = vidLocation.text;
feedViewHolder.descView.setText(desc);
Typeface fontLight = Typeface.createFromAsset(getAssets(),
"miso-light.otf");
feedViewHolder.descView.setTypeface(fontLight);
// More
feedViewHolder.more.setText(getString(R.string.de_list_more));
feedViewHolder.more.setTypeface(fontLight);
// Distance
feedViewHolder.distanceView.setTypeface(fontRegular);
if (location != null) {
double lat = location.getLatitude();
double lng = location.getLongitude();
double lat2 = roundDown(vidLocation.latitude);
double lng2 = roundDown(vidLocation.longitude);
if (countDistance(lat, lng, lat2, lng2) >= 500) {
double kilometer = countDistance(lat, lng, lat2, lng2) / 1000;
int decimalPlaces = 1;
BigDecimal decimal = new BigDecimal(kilometer);
decimal = decimal.setScale(decimalPlaces,
BigDecimal.ROUND_HALF_UP);
double new_km = decimal.doubleValue();
feedViewHolder.distanceView.setText(new_km + " km");
} else {
int decimalPlaces = 1;
BigDecimal decimal = new BigDecimal(countDistance(lat, lng,
lat2, lng2));
decimal = decimal.setScale(decimalPlaces,
BigDecimal.ROUND_HALF_UP);
double meter = decimal.doubleValue();
feedViewHolder.distanceView.setText(meter + " m");
}
videoLocationAdapter.notifyDataSetChanged();
}
convertView.setTag(feedViewHolder);
} else
{
feedViewHolder = (FeedViewHolder) convertView.getTag();
}
return convertView;
}
static class FeedViewHolder{
TextView titleView;
TextView descView;
TextView more;
TextView distanceView;
ImageView v;
}
公共类VideoLocationAdapter扩展了ArrayAdapter{
公共图像加载器;
ImageLoader=null;
公共VideoLocationAdapter(上下文、int资源、,
VideoLocationDB[]videoLocationDBs){
超级(上下文、资源、视频定位数据库);
加载器=新图像加载器(上下文);
}
私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场;
@凌驾
公共视图getView(最终整型位置,视图转换视图,
视图组(父级){
FeedViewHolder FeedViewHolder;
if(convertView==null){
convertView=LocationsListActivity.this.GetLayoutFlater()
.充气(R.layout.listitems,null,true);
feedViewHolder=新的feedViewHolder();
feedViewHolder.titleView=(TextView)convertView.findViewById(R.id.txt_title);
feedViewHolder.descView=(TextView)convertView.findViewById(R.id.txt\u list\u desc);
feedViewHolder.more=(TextView)convertView.findViewById(R.id.txt\u more);
feedViewHolder.distanceView=(TextView)convertView.findViewById(R.id.txt\u距离);
feedViewHolder.v=(ImageView)convertView.findViewById(R.id.image);
最终VideoLocationDB vidLocation=videoLocationsDB[位置];
//形象
字符串url=vidLocation.documental\u缩略图\u url;
字符串名称=vidLocation.name;
feedViewHolder.v.setTag(url);
DisplayImage(url、LocationsListActivity.this、feedViewHolder.v、name);
//头衔
字符串标题=vidLocation.name;
feedViewHolder.titleView.setText(title.toUpperCase());
Typeface fontRegular=Typeface.createFromAsset(getAssets(),
“味噌酱”;
feedViewHolder.titleView.setTypeface(fontRegular);
//描述
字符串desc=vidLocation.text;
feedViewHolder.descView.setText(desc);
Typeface fontLight=Typeface.createFromAsset(getAssets(),
"味噌轻食";;
feedViewHolder.descView.setTypeface(fontLight);
//更多
feedViewHolder.more.setText(getString(R.string.de_list_more));
feedViewHolder.more.setTypeface(fontLight);
//距离
feedViewHolder.distanceView.setTypeface(fontRegular);
如果(位置!=null){
双纬度=location.getLatitude();
double lng=location.getLongitude();
双lat2=舍入(vidLocation.latitude);
双lng2=舍入(vidLocation.longitude);
如果(计数距离(纬度,液化天然气,纬度2,液化天然气)大于等于500){
双公里=计数距离(lat、lng、lat2、lng2)/1000;
整数小数位数=1;
BigDecimal=新的BigDecimal(公里);
十进制=十进制。设置刻度(小数位数,
大十进制。四舍五入(向上取整);
double new_km=十进制。doubleValue();
feedViewHolder.distanceView.setText(新的公里数+公里数);
}否则{
整数小数位数=1;
BigDecimal decimal=新的BigDecimal(countDistance(纬度、液化天然气、,
lat2,lng2);
十进制=十进制。设置刻度(小数位数,
大十进制。四舍五入(向上取整);
双表=十进制。双值();
feedViewHolder.distanceView.setText(米+米);
}
videoLocationAdapter.notifyDataSetChanged();
}
convertView.setTag(feedViewHolder);
}否则
{
feedViewHolder=(feedViewHolder)convertView.getTag();
}
返回视图;
}
静态类FeedViewHolder{
文本视图标题视图;
文本视图;
文本查看更多;
文本视图距离视图;
ImageView v;
}
在if(convertView==null){}和else之后设置文本的out-side/
if(convertView==null){
//创建视图
}否则{
//从convertView获取视图
}
这里设置视图中的文本
看
如果我这样做的话,它会正确显示,但是在listview中滚动仍然很慢。有什么解决方案吗?为什么?即使我像你一样使用ViewHolder代码,我也只是说要更改几行的位置。为了获得更多优化,请使用纯色BG,如果我将行从//Image移动到videoLocationAdapter.notifyDataSetChanged();outside(convertView==null);我有一个滞后的滚动。我不知道为什么,这就是我问的原因。如果我声明convertView=mInflater.inflate(R.layout.listitems,null);我有一个NullPointerException,我完全不知道
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView " + position + " " + convertView);
ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item1, null);
holder = new ViewHolder();
holder.textView = (TextView)convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.textView.setText(mData.get(position));//<========== see it .....
return convertView;
}
}
final VideoLocationDB vidLocation = videoLocationsDB[position];
// Image
String url = vidLocation.documentary_thumbnail_url;
String name = vidLocation.name;
feedViewHolder.v.setTag(url);
loader.DisplayImage(url, LocationsListActivity.this, feedViewHolder.v, name);
// Title
String title = vidLocation.name;
feedViewHolder.titleView.setText(title.toUpperCase());
Typeface fontRegular = Typeface.createFromAsset(getAssets(),
"miso.otf");
feedViewHolder.titleView.setTypeface(fontRegular);
// Description
String desc = vidLocation.text;
feedViewHolder.descView.setText(desc);
Typeface fontLight = Typeface.createFromAsset(getAssets(),
"miso-light.otf");
feedViewHolder.descView.setTypeface(fontLight);
// More
feedViewHolder.more.setText(getString(R.string.de_list_more));
feedViewHolder.more.setTypeface(fontLight);
// Distance
feedViewHolder.distanceView.setTypeface(fontRegular);
if (location != null) {
double lat = location.getLatitude();
double lng = location.getLongitude();
double lat2 = roundDown(vidLocation.latitude);
double lng2 = roundDown(vidLocation.longitude);
if (countDistance(lat, lng, lat2, lng2) >= 500) {
double kilometer = countDistance(lat, lng, lat2, lng2) / 1000;
int decimalPlaces = 1;
BigDecimal decimal = new BigDecimal(kilometer);
decimal = decimal.setScale(decimalPlaces,
BigDecimal.ROUND_HALF_UP);
double new_km = decimal.doubleValue();
feedViewHolder.distanceView.setText(new_km + " km");
} else {
int decimalPlaces = 1;
BigDecimal decimal = new BigDecimal(countDistance(lat, lng,
lat2, lng2));
decimal = decimal.setScale(decimalPlaces,
BigDecimal.ROUND_HALF_UP);
double meter = decimal.doubleValue();
feedViewHolder.distanceView.setText(meter + " m");
}
videoLocationAdapter.notifyDataSetChanged();
}