java - 使用 BaseAdapter 重新排序和重复 ListView 项目

标签 java android listview gridview android-listview

我正在尝试实现一个显示目录列表的 ListView 。每个目录下都有一个带有关联适配器的 GridView (如下所示),显示图像缩略图列表(见下图)。我让它工作得很好,除了每当列表项离开屏幕然后返回到屏幕上时,图像都会重新加载。我正在使用异步任务来下载缩略图并替换每个 ImageView 的占位符图像,因此每次项目离开屏幕时,都会再次下载其所有缩略图,这是 Not Acceptable 。有谁有存储 ImageView (或图像)的此类实现的示例( ListView 适配器内的 GridView 适配器)?执行此操作的正确方法是什么? 预先感谢您的帮助。

Screenshot of Activity

图库适配器

public class GalleryAdapter extends BaseAdapter {
private Context mContext;
ArrayList<GalleryItem> GalleryList;
//MediaAdapter adapter;


public GalleryAdapter(Context c,ArrayList<GalleryItem> l) {
    mContext = c;
    GalleryList = l;
}

public int getCount() {
    return GalleryList.size();
}

public Object getItem(int position) {
    return GalleryList.get(position);
}

public long getItemId(int position) {
    return 0;
}

public View getView(int position, View convertView, ViewGroup parent) {
    GalleryViewHolder viewHolder = null;


    if(convertView==null){
        // inflate the layout
        LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
        convertView = inflater.inflate(R.layout.gallery_item, parent, false);
        viewHolder = new GalleryViewHolder();
        viewHolder.title =  (TextView) convertView.findViewById(R.id.title);
        viewHolder.folder_settings = (ImageView) convertView.findViewById(R.id.folder_settings);
        viewHolder.mediaGrid = (GridView) convertView.findViewById(R.id.imagegrid);
        viewHolder.gridHolder = (LinearLayout) convertView.findViewById(R.id.gridholder);
        convertView.setTag(viewHolder);
    }
    else{
        viewHolder = (GalleryViewHolder) convertView.getTag();
    }



    viewHolder.title.setText(GalleryList.get(position).getTitle());
//Formatting the gridView to fit the screen dim.
    ImageTools mWidth = new ImageTools(mContext);
    viewHolder.mediaGrid.setColumnWidth(mWidth.imageSize());
    int rows = (int) Math.ceil((GalleryList.get(position).getMedia().size() / mWidth.columnNumber)+1);
    LinearLayout.LayoutParams labelLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, mWidth.imageSize()*rows);
    viewHolder.gridHolder.setLayoutParams(labelLayoutParams);
    viewHolder.mediaGrid.setLayoutParams(labelLayoutParams);
    viewHolder.mediaGrid.setMinimumHeight(mWidth.imageSize()*rows);
//Set Adapter for image views
    viewHolder.mediaGrid.setAdapter(new MediaAdapter(convertView.getContext(),GalleryList.get(position).getMedia()));

    viewHolder.folder_settings.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Dialogs.createListDialog(mContext,"Folder Actions", R.array.gallery_action_array).show();
        }
    });

    viewHolder.mediaGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
        }
    });

    return convertView;
}

private class GalleryViewHolder {
    private TextView title;
    private ArrayList<ImageView> imageList;
    private GridView mediaGrid;
    private ImageView folder_settings;
    private LinearLayout gridHolder;
    private int position;
}
}

媒体适配器

public class MediaAdapter extends BaseAdapter {
private Context mContext;
ArrayList<MediaItem> mediaitems;

public MediaAdapter(Context c,ArrayList<MediaItem> l) {
    mContext = c;
    mediaitems = l;
}

public int getCount() {
    return mediaitems.size();
}

public Object getItem(int position) {
    return mediaitems.get(position);
}

public long getItemId(int position) {
    return 0;
}

public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    if (convertView == null) {  // if it's not recycled, initialize some attributes
        imageView = new ImageView(mContext);
        imageView.setImageResource(R.drawable.loading);

        imageView.setTag(R.integer.path,mediaitems.get(position).getPath().toString());
        imageView.setTag(R.integer.fullsize,"false");
        imageView.setTag(R.integer.parentpath,mediaitems.get(position).getParentPath().toString());
        imageView.setTag(R.integer.index , String.valueOf(position));
        try {
            new thumbDownload(mContext).execute(imageView);
        } catch (DbxException e) {
            e.printStackTrace();
        }
        ImageTools mWidth = new ImageTools(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(mWidth.imageSize(), mWidth.imageSize()));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    } else {
        imageView = (ImageView) convertView;
    }

    //imageView.setImageBitmap(mediaitems.get(position).getBitmap());
    return imageView;
}

}

最佳答案

尝试一下这个......可能是它的愚蠢方式,但它对我有用。只需在您的方法中添加一行代码,如下所示的画廊适配器:

public View getView(int position, View convertView, ViewGroup parent) {
GalleryViewHolder viewHolder = null;  
// Add this line.
convertView = null;

if(convertView==null){
    // inflate the layout
    LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
    convertView = inflater.inflate(R.layout.gallery_item, parent, false);
    viewHolder = new GalleryViewHolder();
    viewHolder.title =  (TextView) convertView.findViewById(R.id.title);
    viewHolder.folder_settings = (ImageView) convertView.findViewById(R.id.folder_settings);
    viewHolder.mediaGrid = (GridView) convertView.findViewById(R.id.imagegrid);
    viewHolder.gridHolder = (LinearLayout) convertView.findViewById(R.id.gridholder);
    convertView.setTag(viewHolder);
}
else{
    viewHolder = (GalleryViewHolder) convertView.getTag();
}

// rest of your code

}

关于java - 使用 BaseAdapter 重新排序和重复 ListView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22059825/

相关文章:

java - JMS 生产者和消费者花费了太多时间。为什么?

java - MQTT:向代理发布消息时 Android 应用程序崩溃

android - ABS 到 AppCompat

java - 如何向 Elastic Transport Client 添加身份验证

java - Hibernate:有没有办法以编程方式创建类似于现有表的新表?

php - 如何使用php代码向android发送推送通知?

java - 如何突出显示 ExpandableListView 的组行

c# - 无法从 ListView 中的文本框中获取文本

android - 如何控制 ListView 重新加载。

java - Java枚举和具有私有(private)构造函数的类之间有什么区别?