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