【问题标题】:Android adapter安卓适配器
【发布时间】:2018-01-21 13:53:23
【问题描述】:

我有一个AdapterViewHolder。假设我只想在getView() 方法中为ViewHoler 设置一次数据,实际发生的情况是,每次滚动视图时它都会设置数据。

如何检查ViewHolder 是否已经初始化?

public View getView(final int position, View convertView, ViewGroup parent) {
 final ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
 convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }
Deal deal = dealsArr.get(position);
holder.textView.setText(deal.getPrice);

// Here is my issue. how can I do it only once?
changePrice(deal, true);
}

【问题讨论】:

  • 你不想那样做。 AdapterViewListViewGridView,你有什么)正在将这些 Views 重复用于不同的位置。如果您不相应地更新Views,您的项目将无法正确显示。

标签: android adapter


【解决方案1】:

我假设您已经对 Android Adapters 和getCount() & getView() if not see this 的工作有基本的了解


适配器返回空视图或膨胀视图; findViewbyId(R.id.xmlID) 总是被执行; ViewHolder 用于避免频繁调用,保证列表视图的平滑滚动。

Excellent Explanation here


先花点时间了解一下Listview的回收机制! 我分享的链接也有那个链接。!


public View getView(final int position, View convertView, ViewGroup parent) {
    //rest of the code goes here

}

关注这个方法的参数, 用于回收的convertView最初将为空,因为尚未完成回收 所以这部分代码会被执行;

if (convertView == null) {  //convertView is null when recycling isn't done
            holder = new ViewHolder();
 convertView.setTag(holder);
        }

所以我们初始化视图持有者并使用 findview by id 引用我们所有的视图(按钮、文本视图等)。

下次调用getView();它执行这部分代码;

else {
            holder = (ViewHolder) convertView.getTag();
        }

我强烈建议您先了解 Android 适配器和列表视图回收机制的工作原理,而不要在代码中使用 ViewHolders。首先您了解调用方法的方式和时间,然后使用 ViewHolder 进行更多优化

【讨论】:

    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多