【问题标题】:Android Listview shuffle image load from the net and localAndroid Listview shuffle 从网络和本地加载图像
【发布时间】: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


【解决方案1】:

如果您想从服务器加载列表视图中的图像,然后使用 android 查询来执行此操作,它将为您管理所有事情。您不必为任何事情而烦恼。

check this link for example with code

【讨论】:

    【解决方案2】:

    这是你的问题:

    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
    }  
    

    从网络加载图像不是一个快速的操作,当它运行时,适配器会从它自己的缓存中将图像设置到您的适配器。

    对于这种情况,我经常使用 viewSwitcher - 当我开始加载数据时,我会在加载图像时显示一个进度条。例如 - 这是我的代码: 解释 - newsItem 是我的适配器项目,其中包含 image_url 调用的“pict”和“image”作为我的位图图像。同样在 newsItem 中,我创建了一个 AsyncTask,它将从 url 加载图像,并在将 ArrayList 设置为我的适配器后,我启动了一个 asyncTask 并在显示中显示 progressBar,如果图片已成功下载 - 我将显示图像。

    if (newsItem.pict.length() != 0  && 
        !newsItem.isTaskWasStarted() && 
        newsItem.image == null) {
        loadImage(newsItem, viewItem);
    } else if (newsItem.image != null) {
        viewItem.image.setImageBitmap(newsItem.image);
        viewItem.flipper.setDisplayedChild(1);
    } else if (newsItem.pict.length() == 0) {
        viewItem.flipper.setDisplayedChild(0);
    } else if (newsItem.image == null && newsItem.isTaskWasStarted()) {
        viewItem.flipper.setDisplayedChild(0);
    }
    

    【讨论】:

    • 感谢 whizzzkey,但是:使用“BitmapManagerNoCompressionUser.INSTANCE....”这句话没关系,没问题。但是声明“holder.image.setImageResource ...”我有问题。 (这个操作很快!)
    • @user2968278 请尝试理解 - 在您的 if-else 语句中,您试图从网络或 wrom 资源中获取图像,对吗?但是您只在“else”中设置图像,在“holder.image.setImageResource”中,如果您在BitmapManagerNoCompressionUser中设置图像,则每次下载图像时都必须调用adapter.notifyDatasetChaged。您的适配器将使用 R.drawable.default 每次当它获得“else”并且其他图像尚未下载或适配器尚未被通知图像已加载时
    • @user2968278 换句话说-如果您忘记在“if”中设置任何其他图像或通知该图像已下载-适配器将使用 R.drawable.default,所以我为什么建议您使用进度条 - 表示该图像正在下载。
    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多