【发布时间】:2013-12-13 09:23:46
【问题描述】:
我对列表视图和随机图像有疑问。
前提:我知道单元格/行被重复使用(回收)
我的单元格由一个图像和一些文本视图组成(为了简化我们假设,只有一个图像和一个 tetxview)
如果图像存在于网络上(我知道这是通过业务逻辑...)它是从网络上下载的(正确的图像);否则我会从应用程序包中放一张图片(默认图片)
这样,我有一个随机图像问题。
相反,如果我总是从网络加载默认图像,它可以正常工作。
我的问题是:为什么?为什么如果我从网络加载默认图像就可以了,但是如果我从应用程序的捆绑包中加载默认图像,我就会出现随机图像问题?
提前致谢。
MyAdaper 的代码
public class MyArrayAdapter extends ArrayAdapter<MyObject> {
final String URL_DEFAULT_IMG_USER="https://xxxxxxxxxxx/xxxx/default.png";
private LayoutInflater inflater;
private List<MyObject> data;
LinearLayout l1=null;
Context context=null;
public MyArrayAdapter(Context context,List<MyObject> objects) {
super(context, R.layout.item_myobject, objects);
inflater= LayoutInflater.from(context);
this.data=objects;
this.context=context;
BitmapManagerNoCompressionUser.INSTANCE.setPlaceholder(BitmapFactory.decodeResource(
context.getResources(), R.drawable.user));
}
//ViewHolder class that hold over ListView Item
static class ViewHolder{
//ImageView image;
ImageView image;
TextView displayName;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null){
convertView = inflater.inflate(R.layout.item_myobject, null);
holder =new ViewHolder();
holder.image=(ImageView) convertView.findViewById(R.id.imageView);
holder.displayName =(TextView) convertView.findViewById(R.id.textViewDisplayName);
convertView.setTag(R.id.imageViewMyObject, holder.image);
convertView.setTag(R.id.textViewDisplayName, holder.displayName);
//set tag of convertView to the holder
convertView.setTag(holder);
}
else {
holder =(ViewHolder) convertView.getTag();
/* THIS CODE IS IRRELEVANT FOR THE SUFFLE PROBLEM, BUT I DONT'KNOW IF IT IS NECESSARY
holder.image=(ImageView) convertView.getTag(R.id.imageViewMyObject);
holder.displayName =(TextView) convertView.getTag(R.id.textViewDisplayName);
*/
}
holder.image.setTag(position); // This line is important.
if(data.get(position).getPathFotoServer()!=null ) {
BitmapManagerNoCompressionUser.INSTANCE.loadBitmap(data.get(position).getPathFotoServer(), holder.image, 100,100);
} else {
BitmapManagerNoCompressionUser.INSTANCE.loadBitmap(URL_DEFAULT_IMG_USER, holder.image, 100,100); //IT'S OK
//holder.image.setImageResource(R.drawable.default); //WITH THIS LINE, SHUFFLE IMAGE PROBLEM
}
holder.displayName.setText((CharSequence) data.get(position).getDisplayName());
return convertView;
}
}
item_myobject 的代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="60dp"
android:orientation="horizontal"
android:layout_gravity="fill_vertical"
android:background="@drawable/state_item_listview"
>
<!-- android:layout_margin="5dp" -->
<ImageView
android:id="@+id/imageView"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_margin="5dp"
android:src="@drawable/user" />
<TextView
android:id="@+id/textViewDisplayName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Medium Text"
android:gravity="left"
android:textStyle="bold"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
更新:在活动中添加排序项目的代码:
Collections.sort(data, new Comparator<MyObject>(){
public int compare(MyObject s1, MyObject s2) {
Log.d(TAG, "s1.getDisplayName().compareToIgnoreCase(s2.getDisplayName():"+s1.getDisplayName()+" "+s2.getDisplayName());
return s1.getDisplayName().compareToIgnoreCase(s2.getDisplayName());
}
})
【问题讨论】:
-
什么是“洗牌图像的问题”?
-
我猜问题是java中的List对象不协调,所以例如你希望位置4的图像是“myimage.png”,但这不是因为列表不协调.
-
谢谢,对不起:实际上,当您滚动列表时,有时(随机)默认图像(从应用程序内部加载)被先前从网上下载的图像替换,但是属于另一个行单元格,但如果我总是从网络加载默认图像,它工作正常。我希望这更清楚......对不起我的英语
-
对不起 RedFox,列表是有序的,因为在活动中,在调用适配器之前,我这样做了(我已经更新了帖子)。但是,如果我有一个未排序的列表,问题也应该是当我总是从网上下载所有东西时,或者没有?
标签: android image listview load shuffle