当前位置: 首页 > 知识库问答 >
问题:

Android Listview缓存在初始化时意外工作

常波
2023-03-14

我在listview(又称convertView)中的视图缓存有点麻烦,下面是我的代码,

private class CurrencyAdapter extends ArrayAdapter<CurrencyModel> {
    Context ctx;
    int layoutResourceId;
    List<CurrencyModel> adapter_models = null;

    public CurrencyAdapter(Context ctx, int layoutResourceId,
            List<CurrencyModel> model) {
        super(ctx, layoutResourceId, model);
        this.ctx = ctx;
        this.layoutResourceId = layoutResourceId;
        adapter_models = model;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        Log.d(Constants.APP_TAG, "position: " + position);
        View row = convertView;
        CurrencyAdapterContainer holder = null;
        if (row == null) {
            Log.d(Constants.APP_TAG, "APP NULL");
            row = ((Activity) ctx).getLayoutInflater().inflate(
                    layoutResourceId, parent, false);
            holder = new CurrencyAdapterContainer();
            holder.textView = (TextView) row
                    .findViewById(R.id.currencies_txt);
            holder.imgView = (ImageView) row
                    .findViewById(R.id.currencies_flag_icon);
            row.setTag(holder);

        } else {
            Log.d(Constants.APP_TAG, "APP NOT NULL");
            holder = (CurrencyAdapterContainer) row.getTag();
        }

        CurrencyModel curr = getItem(position);

        if (curr.currency_value == null) {
            if (counter < MAX_COUNTER) {
                ++counter;
                CurrencyJsonDownloader cDownloader = new CurrencyJsonDownloader(
                        curr, holder.textView);  //download currency value in background, and set textview text if currency_value has been loaded in onpostExcecute (i'm using AsyncTask)
                String url = CURRENCY_URL.replace("<symbol>", curr.symbol);
                Log.d(Constants.APP_TAG, "Url currency: " + url);
                cDownloader.execute(url);
            }
            holder.textView.setText("");
        } else {
            holder.textView.setText(curr.currency_value);
        }
        holder.imgView.setImageResource(curr.drawableId);

        return row;
    }

    @Override
    public CurrencyModel getItem(int position) {
        // TODO Auto-generated method stub
        return adapter_models.get(position);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return adapter_models.size();
    }
}

static class CurrencyAdapterContainer {
    ImageView imgView;
    TextView textView;
}

这是我日志中的输出

位置:0应用程序空

位置:1应用程序不为空

位置:2个APP Not NULL

位置:3应用程序不为空

. . .

位置:10应用程序不为空

这会造成灾难,因为这意味着在后台作业中传递的textview是相同的textview,而更改的视图是相同的textview,而另一个textview将具有空白视图,除非我滚动它,当然,这会再次调用getView(),一切正常。但启动应用程序时会出现问题,因为只有一个文本视图总是在改变其值。

那么为什么会发生这种情况呢?有什么我可以做的黑客吗??谢谢之前...

共有2个答案

越季萌
2023-03-14

我认为问题在于你的列表适配器。在这里,我发布了一个适配器类,我认为它将帮助您。

public class UploadListAdaptor extends BaseAdapter {
private Context context;
private List<UploadDetailsObj> uploadList;

public UploadListAdaptor(Context context, List<UploadDetailsObj> list) {
    this.context = context;
    uploadList = list;

}

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

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

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

/** LIST CATEGORY */

public View getView(int position, View convertView, ViewGroup viewGroup) {

    final UploadDetailsObj chlListObj = uploadList.get(position);

    if (convertView == null) {

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater
                .inflate(R.layout.inflator_progress_bar, null);

        TextView photoName = (TextView) convertView
            .findViewById(R.id.tv_photoname);

        Button btnProgress=(Button)convertView.findViewById(R.id.btn_progress);
    photoName.setText(chlListObj.getPhotoName());




    }


    return convertView;

}

   }

您可以使用以下代码调用此适配器。

 List<UploadDetailsObj> listofUploads= new ArrayList<UploadDetailsObj>();
 UploadListAdaptor uploadListAdptr = new UploadListAdaptor(yourclass.this,
            listofUploads);

    uploadListView.setAdapter(uploadListAdptr);
李宜然
2023-03-14

ListView项目视图是循环使用的,所以不要持有对特定项目视图的引用,并期望它在滚动ListView后表示相同的数据。

将数据项传递给工作任务,并让它更新数据。

更新:

  • 如果您当前的项目不在屏幕上,它将从适配器请求(当ListView滚动到它时),并将显示更新的数据
 类似资料:
  • 我有一个工厂,它应该根据名称返回一个实现。 为了让每次调用getMoules方法都不创建实例,有一个映射,其中所有的模块都必须在bootstrap类中初始化。我想摆脱手动操作的需要(也是所有的类都有一个显著的特征)。 我想到的选项列表: 反射(我们可以使用Scala反射API或任何第三方库) 自动化流程 需要在启动时立即初始化 反思是一种痛苦 宏只改变代码,执行稍后发生。 我们能把初始化过程移到编

  • 大家好,我是Kotlin语言的新手,在运行Hello World代码的过程中遇到了一些错误。 无法为初始化脚本'C:\User\HP\AppData\Local\Temp\wrapper_init.gradle'打开初始化泛型类缓存(C:\User\HP. gradle\cache\6.8\script\5mjee5vr2mabvexqryui51pg)。 缺陷源单元“BuildScript”中的

  • 问题内容: 假设您做简单的事情: 现在,随着运行的http://本地主机作为 它需要完成。 现在尝试https:// localhost 这需要。 现在在linux或docker中运行相同的东西: http: https: 为什么是这样?为什么平台之间会有如此巨大的差异?你能为这个做什么? 对于长时间运行的应用程序服务器以及具有各自冗长且繁琐的初始化序列的应用程序,这5秒可能无关紧要。 但是,在许

  • 在此输入图像描述 在此输入图像描述 我试图下载IntelliJ和学习静态编程语言,但我得到一个BUG错误之前,我开始,我现在不知道该怎么办... 我试图删除scipts文件夹,但它只是创建了一个新的scipts文件夹,并说了同样的错误。我还重新安装了IntelliJ,这会产生相同的错误 有人能帮我吗?:-) 无法打开初始化脚本“C:\Users\username\AppData\Local\Tem

  • 据我所知,在Java11中,这两个操作可以在一行中完成,不是吗?

  • 问题内容: 我对来自JQuery Ajax请求的Internet Explorer缓存结果存在严重问题。 我的网页上有标题,每次用户导航到新页面时标题都会更新。页面加载后,我就执行此操作 它只是将标头信息注入页面。您可以通过访问www.wikipediamaze.com进行检查,然后登录并开始创建新拼图。 在我测试过的每种浏览器(谷歌浏览器,Firefox,Safari,Internet Expl