Android 自定义Listview在AsyncTask中不显示任何内容
我正在使用代码将照片列表从图库加载到自定义水平列表视图中。Listview滚动不平稳。我决定把正在加载的照片放在背景中。但是现在listview什么也不显示。你能帮我一下吗?经过一番讨论,我做了一些更正。但是结果显示空的listview Main.javaAndroid 自定义Listview在AsyncTask中不显示任何内容,android,listview,android-asynctask,Android,Listview,Android Asynctask,我正在使用代码将照片列表从图库加载到自定义水平列表视图中。Listview滚动不平稳。我决定把正在加载的照片放在背景中。但是现在listview什么也不显示。你能帮我一下吗?经过一番讨论,我做了一些更正。但是结果显示空的listview Main.java public class Main extends Activity { private HorizontalImageAdapter horizontalimageAdapter; private HorizontalListVi
public class Main extends Activity {
private HorizontalImageAdapter horizontalimageAdapter;
private HorizontalListView listview;
private Utilf utils;
private ArrayList<String> imagePaths = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_horizontal_list_view);
utils = new Utilf(this);
imagePaths = utils.getFilePaths();
listview = (HorizontalListView) findViewById(R.id.gallery);
horizontalimageAdapter = new HorizontalImageAdapter(this, imagePaths);
listview.setAdapter(horizontalimageAdapter);
}
}
public类主扩展活动{
私有HorizontalImageAdapter HorizontalImageAdapter;
私有水平视图列表视图;
私人公用事业;
私有ArrayList ImagePath=新ArrayList();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\水平\列表\视图);
utils=新的Utilf(本);
ImagePath=utils.getFilePath();
listview=(HorizontalListView)findViewById(R.id.gallery);
horizontalimageAdapter=新的horizontalimageAdapter(这是ImagePath);
setAdapter(horizontalimageAdapter);
}
}
HorizontalImageAdapter.java
public class HorizontalImageAdapter extends BaseAdapter {
private Activity context;
private static ImageView imageView;
private ArrayList<String> plotsImages;
private LayoutInflater l_Inflater;
public HorizontalImageAdapter(Activity context, ArrayList<String> plotsImages) {
this.context = context;
this.plotsImages = plotsImages;
l_Inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return plotsImages.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = l_Inflater.inflate(R.layout.listview_item, null);
holder = new ViewHolder();
holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (holder.imageView != null) {
new ImageDownloaderTask(holder.imageView).execute(plotsImages.get(position));
}
return convertView;
}
private static class ViewHolder {
ImageView imageView;
}
}
公共类HorizontalImageAdapter扩展了BaseAdapter{
私人活动语境;
私有静态图像视图;
私人ArrayList绘图;
私人充气机;
公共水平图像适配器(活动上下文、ArrayList绘图页){
this.context=上下文;
this.plotsImages=plotsImages;
l_Inflater=从(上下文)开始的布局更平坦;
}
@凌驾
public int getCount(){
返回plotsImages.size();
}
@凌驾
公共对象getItem(int位置){
返回null;
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=l\u充气机。充气(R.layout.listview\u项,空);
holder=新的ViewHolder();
holder.imageView=(imageView)convertView.findViewById(R.id.icon);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
if(holder.imageView!=null){
新建ImageDownloaderTask(holder.imageView).execute(plotsImages.get(position));
}
返回视图;
}
私有静态类视图持有者{
图像视图图像视图;
}
}
ImageDownloader.java
class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
private int imageWidth = 96;
public ImageDownloaderTask(ImageView imageView) {
imageViewReference = new WeakReference<ImageView>(imageView);
}
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap = loadBitmap(params[0]);
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (isCancelled()) {
bitmap = null;
}
if (imageViewReference != null) {
ImageView imageView = imageViewReference.get();
if (imageView != null) {
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
} else {
// imageView.setImageDrawable(imageView.getContext().getResources().getDrawable(R.drawable.list_placeholder));
}
}
}
}
class ImageDownloaderTask扩展异步任务{
私有最终WeakReference imageViewReference;
私有int imageWidth=96;
公共图像下载任务(图像视图图像视图){
imageViewReference=新的WeakReference(imageView);
}
@凌驾
受保护位图doInBackground(字符串…参数){
位图位图=加载位图(参数[0]);
返回位图;
}
@凌驾
受保护的void onPostExecute(位图){
如果(isCancelled()){
位图=空;
}
if(imageViewReference!=null){
ImageView=imageViewReference.get();
如果(imageView!=null){
if(位图!=null){
设置图像位图(位图);
}否则{
//setImageView.setImageDrawable(imageView.getContext().getResources().getDrawable(R.drawable.list_占位符));
}
}
}
}
- 列表项
请检查您的
方法。它返回null。相反,您必须从该位置本身的列表中返回对象getItem(int position)
- getView()方法
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
// reuse views
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.rowlayout, null);
// configure view holder
ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) rowView.findViewById(R.id.TextView01);
viewHolder.image = (ImageView) rowView
.findViewById(R.id.ImageView01);
rowView.setTag(viewHolder);
}
// fill data
ViewHolder holder = (ViewHolder) rowView.getTag();
String s = names[position];
holder.text.setText(s);
if (s.startsWith("Windows7") || s.startsWith("iPhone")
|| s.startsWith("Solaris")) {
holder.image.setImageResource(R.drawable.no);
} else {
holder.image.setImageResource(R.drawable.ok);
}
return rowView;
}
从链接获取的代码不能这样做,因为您的imageview将被重复使用多次。 您需要一种方法来检查asynctask加载完位图后,您是否仍在listview的同一行,否则在滚动listview时,您将在随机位置显示图像。为此,您可以将位图url存储为imageview上的标记,并在调用setImageBitmap()之前检查该标记。如果匹配,则可以显示位图,否则不执行任何操作
但是就像@HERO说的,你为什么不使用毕加索库,这样做会更好;)在
onPostExecute
这行listview.setAdapter(mAdapter)中发布你的loadBitmap(…)
methodset adapter
必须在onPostExecute
没有冒犯的意思,但是为什么你要尝试重新发明轮子?像UIL()和毕加索()这样的库被创建来帮助你完成你的工作。@SweetWisherツ, 我想他已经在listview中设置了适配器。Async用于将图像加载到适配器内部的viewholder中。在我看来,这就是它的样子。我需要水平listview。然后你需要使用ViewPager,而不是listview。但是,如果你在正确的imageview中显示图像,则从Async任务加载图像的代码只能随机工作(参考我的回答)ViewPager不适用于我,因为我需要gallery之类的小部件。Imageview不为null,因此它调用异步加载。我需要重新加载适配器吗?但如何进行?是的,但如果用户正在滚动,Imageview很可能已被回收,您将无法在需要的位置显示图像。如果要实现gall,则需要使用ViewPagerery。我不明白你关于重新加载适配器的问题。请阅读我的答案,其中解释了你在使用代码时将面临的问题。这没有帮助。我的代码在没有异步加载的情况下运行良好,平滑滚动除外。