ListView的回收机制如何运作

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机制。


呼唤远方
浏览 733回答 4
4回答

饮歌长啸

请注意,在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..

慕妹3146593

使用Holder模式,您可以实现您想要的:你可以在这里找到这种模式的描述:当您向下滚动屏幕并且上面的列表视图项被隐藏时,会发生列表视图的回收。它们被重用以显示新的列表视图项。

守着一只汪

Recyclerview只是一个以高效的方式管理动态视图添加的包装类,即重用已经创建的视图。想想recyclerview适配器,调用方法的顺序是 -getItemCount - 首先调用它,以便适配器知道需要创建或管理多少视图。getItemViewType-接下来调用此方法以了解需要膨胀的视图类型。onCreateViewHolder - 接下来调用它来知道要膨胀的视图。onBindViewHolder-进入此步骤适配器将为您提供viewholder的实例,该实例持有相对于位置的膨胀视图,因此您可以在此处设置视图上的数据。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android
Java