Android 从远程服务器下载的带有ImageView的LIstView

Android 从远程服务器下载的带有ImageView的LIstView,android,listview,scroll,recycle,Android,Listview,Scroll,Recycle,我想使用从远程服务器响应中检索的“imageview”创建一个listview。仅当需要/必要时才填充此项 代码按预期工作,但是,当我向下或向上滚动更快时,行上的图像会被洗牌(请注意,只有图像会被洗牌,而不是TextView值…) 在这方面,谁能帮助我一步一步地解决这个问题?谢谢 :[这里是代码] 包com.example.myapplication import java.io.File; import java.io.InputStream; import java.lang.ref.Wea

我想使用从远程服务器响应中检索的“imageview”创建一个listview。仅当需要/必要时才填充此项

代码按预期工作,但是,当我向下或向上滚动更快时,行上的图像会被洗牌(请注意,只有图像会被洗牌,而不是TextView值…)

在这方面,谁能帮助我一步一步地解决这个问题?谢谢

:[这里是代码]

包com.example.myapplication

import java.io.File;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.lang.reflect.Array;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Typeface;

import android.net.Uri;
import android.os.AsyncTask;
import android.support.v4.content.res.ResourcesCompat;
import android.util.Log;
import android.util.LruCache;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class ExpandableListAdapter extends BaseExpandableListAdapter {


    private Context _context;
    private List < String > _listDataHeader; // header titles
    private List < String > _listDataSubTitle; // header subtitles titles
    private List < String > _listDataBigPlaceholder; // data big header placeholders 
    private List < String > _listDataSmallPlaceholder; // data small header placeholders 
    // child data in format of header title, child title
    private HashMap < String, List < String >> _listDataChild;


    public ExpandableListAdapter(Context context, List < String > listDataHeader,
        HashMap < String, List < String >> listChildData,
        List < String > _listDataSubTitle,
        List < String > _listDataBigPlaceholder,
        List < String > _listDataSmallPlaceholder) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataSubTitle = _listDataSubTitle;
        this._listDataBigPlaceholder = _listDataBigPlaceholder;
        this._listDataSmallPlaceholder = _listDataSmallPlaceholder;
        this._listDataChild = listChildData;
    }


    @
    Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
            .get(childPosititon);
    }

    public Object getSubtitle(int groupPosition) {
        return this._listDataSubTitle.get(groupPosition);
    }

    private Object getBigLogoStr(int groupPosition) {

        return this._listDataBigPlaceholder.get(groupPosition);
    }

    private Object getSmallLogoStr(int groupPosition) {
        return this._listDataSmallPlaceholder.get(groupPosition);
    }

    @
    Override
    public long getChildId(int groupPosition, int childPosition) {

        return childPosition;
    }

    @
    Override
    public View getChildView(int groupPosition, final int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) {

        final String childText = (String) getChild(groupPosition, childPosition);

        if (convertView == null) {
            LayoutInflater Inflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = Inflater.inflate(R.layout.list_item, null);
        }

        TextView txtListChild = (TextView) convertView
            .findViewById(R.id.lblListItem);


        txtListChild.setText(childText);
        return convertView;
    }

    @
    Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
            .size();
    }

    @
    Override
    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition);
    }

    @
    Override
    public int getGroupCount() {
        return this._listDataHeader.size();
    }

    @
    Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @
    Override
    public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent) {


        ViewHolder viewHolder = null;
        String headerTitle = (String) getGroup(groupPosition);
        String SubTitle = (String) getSubtitle(groupPosition);


        if (convertView == null) {


            LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_group, null);
            viewHolder = new ViewHolder();
            viewHolder.FirstText = (TextView) convertView.findViewById(R.id.lblListHeader);
            viewHolder.SecondText = (TextView) convertView.findViewById(R.id.lblListSubTitle);
            viewHolder.SmallImage = (ImageView) convertView.findViewById(R.id.lblPlaceHolderS);
            viewHolder.BigImage = (ImageView) convertView.findViewById(R.id.lblPlaceHolder);



            String BigLogoStr = (String) getBigLogoStr(groupPosition);
            String SmallLogoStr = (String) getSmallLogoStr(groupPosition);

            String url = "";
            String url2 = "";
            if (BigLogoStr == "null") {
                url2 = "http://domain/images/default.jpg";
            } else {
                url2 = "http://domain/" + this._listDataBigPlaceholder.get(groupPosition);
            }
            if (SmallLogoStr == "null") {
                url = "http://domain/images/default2.jpg";
            } else {
                url = "http://domain/" + this._listDataSmallPlaceholder.get(groupPosition);
            }



            convertView.setTag(viewHolder);


        } else {



            viewHolder = (ViewHolder) convertView.getTag();

            //viewHolder.ThirdText = groupPosition;
            viewHolder.BigImage.setImageBitmap(null);
            viewHolder.SmallImage.setImageBitmap(null);

            String BigLogoStr = (String) getBigLogoStr(groupPosition);
            String SmallLogoStr = (String) getSmallLogoStr(groupPosition);
            String url = "";
            String url2 = "";
            if (BigLogoStr == "null") {
                url2 = "http://domain/images/default.jpg";
            } else {
                url2 = "http://domain/" + this._listDataBigPlaceholder.get(groupPosition);
            }
            if (SmallLogoStr == "null") {
                url = "http://domain/images/default.jpg";
            } else {
                url = "http://domain/" + this._listDataSmallPlaceholder.get(groupPosition);
            }


            if (viewHolder.BigImage.getTag() == null) Image.loadToView(url2, viewHolder.BigImage);
            if (viewHolder.SmallImage.getTag() == null) Image.loadToView(url, viewHolder.SmallImage);
            Bitmap imagenAndroid = BitmapFactory.decodeResource(this._context.getResources(), R.id.lblPlaceHolder);

            viewHolder.BigImage.setImageBitmap(imagenAndroid);

        }

        viewHolder.FirstText.setText(headerTitle);
        viewHolder.SecondText.setText(SubTitle);

        String BigLogoStr = (String) getBigLogoStr(groupPosition);
        String SmallLogoStr = (String) getSmallLogoStr(groupPosition);
        String url = "";
        String url2 = "";
        if (BigLogoStr == "null") {
            url2 = "http://domain/images/default.jpg";
        } else {
            url2 = "http://domain/" + this._listDataBigPlaceholder.get(groupPosition);
        }
        if (SmallLogoStr == "null") {
            url = "http://domain/images/default.jpg";
        } else {
            url = "http://domain/" + this._listDataSmallPlaceholder.get(groupPosition);
        }

        if (viewHolder.BigImage.getTag() == null) Image.loadToView(url2, viewHolder.BigImage);
        if (viewHolder.SmallImage.getTag() == null) Image.loadToView(url, viewHolder.SmallImage);

        return convertView;
    }

    @
    Override
    public boolean hasStableIds() {
        return false;
    }

    @
    Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    static class ViewHolder {
        private TextView FirstText;
        private TextView SecondText;
        private int ThirdText;
        private ImageView BigImage;
        private ImageView SmallImage;


        public Bitmap getImage() {
            //return image;
            return null;
        }
    }


    private static class Image {

        private static LruCache < String, Bitmap > mMemoryCache = null;
        private static int cacheSize = 1024 * 1024 * 10;

        private static class imageDownloaderTaskC extends AsyncTask < String, Void, Bitmap > {

            private ImageView mTarget;

            public imageDownloaderTaskC(ImageView target) {
                this.mTarget = target;
            }

            @
            Override
            protected void onPreExecute() {
                mTarget.setTag(this);
            }

            @
            SuppressLint("NewApi")@ Override
            protected Bitmap doInBackground(String...urls) {

                String url = urls[0];

                Bitmap result = null;

                if (url != null) {
                    //Log.d("DOWNLOAD START!","bitmap "+url);
                    result = load(url);

                    if (result != null) {
                        //Log.d("STORE ON CACHE","bitmap "+url);
                        mMemoryCache.put(url, result);
                        //Log.d("rexult bitmap::","");
                    }
                }
                return result;
            }

            @
            Override
            protected void onPostExecute(Bitmap result) {

                if (mTarget.getTag() == this) {
                    mTarget.setTag(null);

                    if (result != null)
                        mTarget.setImageBitmap(result);

                } else if (mTarget.getTag() != null) {

                    ((imageDownloaderTaskC) mTarget.getTag()).cancel(true);
                    mTarget.setTag(null);
                }
            }
        }

        private static Bitmap downloadBitmapD(String url) {
            HttpURLConnection urlConnection = null;
            try {
                URL uri = new URL(url);
                urlConnection = (HttpURLConnection) uri.openConnection();

                final int responseCode = urlConnection.getResponseCode();
                int statusCode = urlConnection.getResponseCode();
                if (statusCode != HttpURLConnection.HTTP_OK) {
                    return null;
                }

                InputStream inputStream = urlConnection.getInputStream();
                if (inputStream != null) {
                    Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

                    //Log.d("DOWNLOADING BITMAP::",""+url);
                    return bitmap;
                }
            } catch (Exception e) {
                urlConnection.disconnect();
                Log.w("ImageDownloader", "Error downloading image from " + url);
            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
            }
            return null;
        }

        public static Bitmap load(String urlString) {

            BitmapFactory.Options options = new BitmapFactory.Options();

            Bitmap bitmap = downloadBitmapD(urlString);

            if (bitmap == null)
                bitmap = BitmapFactory.decodeResource(MyApplication.context().getResources(), R.drawable.placeholder);


            return bitmap;
        }

        @
        SuppressLint("NewApi")
        public static void loadToView(String url, ImageView view) {

            if (url == null || url.length() == 0)
                return;

            if (mMemoryCache == null) {
                //Log.d("MEMORY CACHE:::","CREATED SUCCESSFULLY!");
                mMemoryCache = new LruCache < String, Bitmap > (cacheSize) {

                    @
                    Override
                    protected int sizeOf(String key, Bitmap bitmap) {
                        return (bitmap.getRowBytes() * bitmap.getHeight());
                    }
                };
            }

            Bitmap bitmap = getBitmapFromMemCache(url);

            if (bitmap == null) {

                final imageDownloaderTaskC task = new imageDownloaderTaskC(view);
                view.setTag(task);
                task.execute(url);
            } else {
                view.setImageBitmap(bitmap);
            }
        }


        @
        SuppressLint("NewApi")
        public static Bitmap getBitmapFromMemCache(String url) {

            return (Bitmap) mMemoryCache.get(url);
        }
    }



}
导入java.io.File;
导入java.io.InputStream;
导入java.lang.ref.WeakReference;
导入java.lang.reflect.Array;
导入java.net.HttpURLConnection;
导入java.net.URI;
导入java.net.URL;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入android.annotation.SuppressLint;
导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.graphics.Typeface;
导入android.net.Uri;
导入android.os.AsyncTask;
导入android.support.v4.content.res.ResourcesCompat;
导入android.util.Log;
导入android.util.LruCache;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseExpandableListAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类ExpandableListAdapter扩展了BaseExpandableListAdapter{
私人语境(private Context)(私人语境);;
私有列表\u listDataHeader;//标题
私有列表\u listDataSubTitle;//标题字幕标题
私有列表\u listDataBigPlaceholder;//数据大标题占位符
私有列表\u listDataSmallPlaceholder;//数据小标题占位符
//标题标题、子标题格式的子数据
私有HashMap\u listDataChild;
公共ExpandableListAdapter(上下文,列表listDataHeader,
HashMap>listChildData,
列表\u列表数据子标题,
列表\u listDataBigPlaceholder,
列表<字符串>\u ListDataSmall占位符){
这._context=context;
这。_listDataHeader=listDataHeader;
此._listDataSubTitle=_listDataSubTitle;
此._listDataBigPlaceholder=\u listDataBigPlaceholder;
这是.\u listDataSmallPlaceholder=\u listDataSmallPlaceholder;
这。_listDataChild=listChildData;
}
@
推翻
公共对象getChild(int-groupPosition、int-ChildPosition){
返回此。_listDataChild.get(此。_listDataHeader.get(groupPosition))
.get(childpositionon);
}
公共对象getSubtitle(int-groupPosition){
返回此。\u listDataSubTitle.get(groupPosition);
}
私有对象getBigLogoStr(int-groupPosition){
返回此。\u listDataBigPlaceholder.get(groupPosition);
}
私有对象getSmallLogoStr(int-groupPosition){
返回此。\u listDataSmallPlaceholder.get(groupPosition);
}
@
推翻
公共长getChildId(int-groupPosition,int-childPosition){
返回子位置;
}
@
推翻
公共视图getChildView(int groupPosition,final int childPosition,
布尔值isLastChild、视图转换视图、视图组父级){
最终字符串childText=(字符串)getChild(groupPosition,childPosition);
if(convertView==null){
LayoutInflater充气器=(LayoutInflater)此。\u上下文
.getSystemService(上下文布局\充气机\服务);
convertView=充气机。充气(R.layout.list_项,空);
}
TextView txtListChild=(TextView)convertView
.findviewbyd(R.id.lblListItem);
setText(childText);
返回视图;
}
@
推翻
公共整数getChildrenCount(整数组位置){
返回此。_listDataChild.get(此。_listDataHeader.get(groupPosition))
.size();
}
@
推翻
公共对象getGroup(int-groupPosition){
返回此。\u listDataHeader.get(groupPosition);
}
@
推翻
public int getGroupCount(){
返回此值。_listDataHeader.size();
}
@
推翻
公共长getGroupId(int-groupPosition){
返回组位置;
}
@
推翻
公共视图getGroupView(int-groupPosition,布尔值isExpanded,
视图(视图、视图组父级){
ViewHolder ViewHolder=null;
字符串头文件=(字符串)getGroup(groupPosition);
String SubTitle=(String)getSubtitle(groupPosition);
if(convertView==null){
LayoutInflater infalInflater=(LayoutInflater)this.\u上下文
.getSystemService(上下文布局\充气机\服务);
convertView=infalInflater.充气(R.layout.list_组,空);
viewHolder=新的viewHolder();
viewHolder.FirstText=(TextView)convertView.findViewById(R.id.lblistheader);
viewHolder.SecondText=(TextView)convertView.findViewById(R.id.lblistsubtitle);
viewHolder.SmallImage=(ImageView)convertView.findViewById(R.id.lblPlaceHolderS);
viewHolder.BigImage=(ImageView)convertView.findViewById(R.id.lblPlaceHolder);
String BigLogoStr=(String)getBigLogoStr(groupPosition);
String SmallLogoStr=(String)getSmallLogoStr(groupPosition);
字符串url=“”;
字符串url2=“”;
如果(BigLogoStr==“空”){
url2=”http://domain/images/default.jpg";
}否则{
url2=”http://domain/“+this.\u listDataBigPlaceholder.get(groupPosition);
}
if(SmallLogoStr==“null”){
url=”http://domain/images/default2.jpg";
}否则{
url=”http://domain/“+这个
ImageLoader imageLoader = ImageLoader.getInstance(); // Get singleton instance

// Load image, decode it to Bitmap and display Bitmap in ImageView (or any other view 
//  which implements ImageAware interface)
imageLoader.displayImage(imageUri, imageView);