为了账号安全,请及时绑定邮箱和手机立即绑定

ListView的回收机制如何运作

ListView的回收机制如何运作

呼唤远方 2019-05-24 15:55:01
ListView的回收机制如何运作所以我之前遇到过这个问题,我自然就在这里寻求帮助。Luksprog的答案很棒,因为我不知道ListView和GridView如何通过回收视图优化自身。因此,根据他的建议,我能够改变将Grid添加到GridView的方式。问题是现在我有一些没有意义的事情。这是getView我的BaseAdapter:public View getView(int position, View convertView, ViewGroup parent) {         if(convertView == null) {             LayoutInflater inflater = LayoutInflater.from(parent.getContext());             convertView = inflater.inflate(R.layout.day_view_item, parent, false);         }         Log.d("DayViewActivity", "Position is: "+position);         ((TextView)convertView.findViewById(R.id.day_hour_side)).setText(array[position]);         LinearLayout layout = (LinearLayout)convertView.findViewById(R.id.day_event_layout);         //layout.addView(new EventFrame(parent.getContext()));         TextView create = new TextView(DayViewActivity.this);         LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,          62, getResources().getDisplayMetrics()), 1.0f);         params.topMargin = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics());         params.bottomMargin = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics());         create.setLayoutParams(params);         create.setBackgroundColor(Color.BLUE);         create.setText("Test");                }         return convertView;     }}问题是当我滚动时,发生这种情况,而不是在位置0 ...看起来像位置6和位置8,再加上它将两个放在位置8.现在我仍然试图使用ListView和GridView,所以我做不明白为什么会这样。我提出这个问题的一个主要原因是帮助那些可能不了解ListView和GridView的回收View的人,或者本文的方式,ScrapView机制。
查看完整描述

4 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

请注意,在Holder模式中,如果在Holder对象中设置位置,则应每次都设置它,例如:

@Overridepublic final View getView(int position, View view, ViewGroup parent) {
    Holder holder = null;
    if (view == null) {
        LayoutInflater inflater = (LayoutInflater) App.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(getContainerView(), parent, false);
        holder = getHolder(position, view, parent);
        holder.setTag(tag);
        view.setTag(holder);
    } else {
        holder = (Holder) view.getTag();
    }
    holder.position = position;
    draw(holder);
    return holder.getView();}

这是一个抽象类的例子,其中

getHolder(position, view, parent);

完成所有的设置操作

ImageViews, TextViews, etc..


查看完整回答
反对 回复 2019-05-24
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

使用Holder模式,您可以实现您想要的:

你可以在这里找到这种模式的描述:

当您向下滚动屏幕并且上面的列表视图项被隐藏时,会发生列表视图的回收。它们被重用以显示新的列表视图项。


查看完整回答
反对 回复 2019-05-24
?
守着一只汪

TA贡献1872条经验 获得超3个赞

Recyclerview只是一个以高效的方式管理动态视图添加的包装类,即重用已经创建的视图。

想想recyclerview适配器,调用方法的顺序是 -

  • getItemCount - 首先调用它,以便适配器知道需要创建或管理多少视图。

  • getItemViewType-接下来调用此方法以了解需要膨胀的视图类型。

  • onCreateViewHolder - 接下来调用它来知道要膨胀的视图。

  • onBindViewHolder-进入此步骤适配器将为您提供viewholder的实例,该实例持有相对于位置的膨胀视图,因此您可以在此处设置视图上的数据。


查看完整回答
反对 回复 2019-05-24
  • 4 回答
  • 0 关注
  • 732 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信