在主线程中加载listView.setAdapter需要花费太多时间

时间:2016-02-09 15:08:47

标签: android multithreading performance listview

所以基本上我可能有50张图片&在每个列表项中都没有太多的数据要加载,但是当我调用setAdapter时,它只需要至少8秒来加载最终用户可见的前3个项目。我添加了日志,发现适配器中的getView()被调用了两次。有什么方法可以减少这个时间吗?

在任何人询问之前,我不能使用AsyncTask,因为我需要在主线程中调用setAdapter并且问题仍然存在。

使用RecycleView会更有效吗?我知道RecycleView是listView的下一个版本,但在设置适配器时我无法看到任何特别的区别。

任何帮助表示赞赏!感谢

更新:这是我的适配器代码:

        @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder view;

        if (convertView == null) {
            view = new ViewHolder();
            convertView = layoutInflater.inflate(R.layout.fragment_test, null);

            view.inActiveView = convertView.findViewById(R.id.front);
            view.inActiveRewardTxt = (TextView) convertView.findViewById(R.id.status_lock_reward);
            view.inActiveTitleTxt = (TextView) convertView.findViewById(R.id.status_lock_title);

            view.completedView = convertView.findViewById(R.id.offerTitlePanel);

            view.activeView = convertView.findViewById(R.id.back);
            view.offerNumberTxt = (TextView) convertView.findViewById(R.id.offerNumberTxt);

            view.walletView = convertView.findViewById(R.id.offerWalletPanel);
            view.walletGiftView = (ImageView) convertView.findViewById(R.id.offerGiftImg);
            view.rewardTxt = (TextView) convertView.findViewById(R.id.offerWalletRibbonTxt);
            view.offerTitleTxt = (TextView) convertView.findViewById(R.id.offerTitleTxt);
            view.offerDescTxt = (TextView) convertView.findViewById(R.id.pagerDescTaskTxt);
            view.offerActionTxt = (TextView) convertView.findViewById(R.id.offerActionTxt);
            view.offerTimerTxt = (TextView) convertView.findViewById(R.id.offerTimerTxt);
            view.offerStatusBtn = (TextView) convertView.findViewById(R.id.offerStatusBtn);
            view.offerReportBtn = (TextView) convertView.findViewById(R.id.offerReportBtn);

            view.dataProgressBar = (ProgressBar) convertView.findViewById(R.id.data_loader);
            view.dataLoadedView = convertView.findViewById(R.id.loaded_view);
            view.calendarView = (CalendarView) convertView.findViewById(R.id.calendar_view);

            view.dataView = convertView.findViewById(R.id.dataView);
            view.dataInfoTxt = (TextView) convertView.findViewById(R.id.dataInfoTxt);
            view.dataEarnedTxt = (TextView) convertView.findViewById(R.id.dataEarnedTxt);
            view.dataProgress = (ProgressBar) convertView.findViewById(R.id.dataProgress);

            convertView.setTag(view);
        } else {
            view = (ViewHolder) convertView.getTag();
        }

  //display all the values here

return convertView;

2 个答案:

答案 0 :(得分:0)

只需根据您提供的代码判断,加载3个视图似乎不需要8秒钟。是否有可能在UI线程上进行任何其他繁重的处理?

答案 1 :(得分:0)

所以我使用了recyclerView来解决这个问题。谢谢你的帮助!