多个RecyclerView滚动时,Android UI卡顿问题

3
我的问题很简单,为什么会出现卡顿现象?
这个布局:
    <ScrollView>
         <RelativeLayout>
             <RecyclerView1/>
             <RecyclerView2/>
             <RecyclerView3/>
         </RelativeLayout>
    </ScrollView>

recyclerview(1,2)是横向的,而(3)是纵向的高度为wrap_content。当我滑动到rv(3)时,它不会出现延迟,只有在显示rv(1,2)时才会。

足够了解基础知识,为什么在填充子项时会出现卡顿,而在空置时却没有?这对我来说毫无意义。

我相信背景中有很多我不知道的事情。措施或其他什么?有人知道发生了什么吗?或者如果有人能帮我指点一下正确的方向来解决这个问题。我做的某些事情被反感了吗?

为了澄清事情,我包括RV的ViewHolder和Adapter:

ViewHolder

public class ObjHolder extends RecyclerView.ViewHolder {

 private static String              TAG         = "[ObjHolder]";

 public Obj                         mObj;
 public CardView                    mContainer;
 public TextView                    mAttr1;
 public TextView                    mAttr2;
 public TextView                    mAttr3;
 public TextView                    mAttr4;
 public TextView                    mAttr5;

 public OnObjClickListener  mCallback   = null;

 public ObjHolder(View v) {
    super(v);

    mContainer = (CardView) v;

    mAttr1 = (TextView) mContainer.findViewById(R.id.obj_details_attr1);
    mAttr2 = (TextView) mContainer.findViewById(R.id.obj_details_attr2);
    mAttr3 = (TextView) mContainer.findViewById(R.id.obj_details_attr3);
    mAttr4 = (TextView) mContainer.findViewById(R.id.obj_details_attr4);
    mAttr5 = (TextView) mContainer.findViewById(R.id.obj_details_attr5);

    mContainer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (DEBUG) Log.d(TAG, "onClick()");
            if (mCallback != null) mCallback.onObjClick(mObj);
        }
    });
 }

 public void setOnObjClickListener(OnObjClickListener onObjClickListener) {
    mCallback = onObjClickListener;
 }
}

适配器

public class ObjAdapter extends AbstractCursorRecyclerViewAdapter<RecyclerView.ViewHolder> implements OnObjClickListener {

 private static final String    TAG     = "[ObjAdapter]";

 private OnObjClickListener mCallback   = null;

 public ObjAdapter( Context context, Cursor cursor) {
    super(context, cursor);
 }

 @Override
 public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, Cursor cursor) {

    if (viewHolder instanceof ObjHolder) {

        ObjHolder objHolder = (ObjHolder) viewHolder;

        final Obj obj = new Obj(cursor);

        objHolder.mAttr1.setText(obj.attr1);
        objHolder.mAttr2.setText(obj.attr2);
        objHolder.mAttr3.setText(obj.attr3);
        objHolder.mAttr4.setText(obj.attr4);
        objHolder.mAttr5.setText(obj.attr5);
        objHolder.mObj = obj;

        objHolder.setOnObjClickListener(this);

        MyDatabase db = MyDatabase.getInstance(getContext());
        Cursor childCursor = db.getChildren(obj);

        // Count children who matters to present in the card
        int attribMatch = 0;
        try {
            while (childCursor.moveToNext()) {
                if (childCursor.getString(1) != null) {
                    int newStatusValue = Integer.parseInt(childCursor.getString(1));

                    if (newStatusValue >= 5) attribMatch++;
                }
            }
        }
        finally {
            childCursor.close();
        }

        if (Integer.parseInt(obj.statusValue) >= 10) objHolder.mContainer.setForeground(ContextCompat.getDrawable(getContext(), R.drawable.bg_warning_border));

        objHolder.mAttrib1.setText(""
                                    + attribMatch);

        if (attribMatch > 0) objHolder.mAttrib2.setTextColor(getContext().getResources().getColor(R.color.red));

    }
 }

 @Override
 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
                                        int viewType) {
    return new ObjHolder(
                LayoutInflater.from(parent.getContext()).inflate(R.layout.obj_details, parent, false));
 }

 public void setOnObjClickListener(OnObjClickListener onObjClickListener) {
    mCallback = onObjClickListener;
 }

 @Override
 public void onObjClick(Obj obj) {
    if (mCallback != null) mCallback.onObjClick(obj);
 }
}

  1. “当我滚动到rv(3)时,它不会卡顿,只有在显示rv(1,2)时才会卡顿”,你是指哪个滚动条出现了卡顿?
  2. 你在RecyclerView中填充了什么内容?
- Eftekhari
当我在ScrollView(而不是RecyclerView(1/2/3))中垂直滚动时,界面会非常卡顿。 当我在RecyclerView 1/2中水平滚动时,视图不会卡顿。 当我只看到RecyclerView 3(当我已经滚过RecyclerView 1和2时),ScrollView不会卡顿。我用几个CardViews填充它们,每个可能有8-15个。 Rv1&2是水平的,第3个是垂直的。希望现在更清楚了 =) - Matti Torvaldsson
试试将你的ScrollView替换为RecyclerView。也许是你的RVs在进行垃圾回收时导致了卡顿的原因。了解到结果会很有趣。如果你能提供一个滚动时ScrollView行为的片段就好了。 - Eftekhari
我想我已经找到了导致延迟的原因。Rv1/2的子视图有点复杂,这反过来使得滚动需要很长时间。即使我只尝试使用一个RV,它也会出现延迟,所以我想简化子视图会有所改善 -> 它开始变得不那么卡了! :D 所以现在我将尝试更改每个RV的子视图,使其更简单,信息更少。希望这将有所帮助 =) - Matti Torvaldsson
我曾经遇到过你的问题,并通过使用xml布局而不是编程方式创建它们来解决了这个问题。只需在onCreateViewHolder中使用inflater调用它们,就会看到差异。然后,最终视图view = layoutInflater.inflate(R.layout.custom_rv_item, parent, false);最后RVViewHolder rVViewHolder = new RVViewHolder(view); 然后返回rVViewHolder。如果你明白我的意思并得到了结果,请告诉我 :) - Eftekhari
我现在改进了我的问题并提供了一些更简化的代码。我一直使用xml布局,所以很遗憾我不知道为什么它对你来说工作得更好。 免责声明:这是非常简化的代码,因此这不是生产代码。 - Matti Torvaldsson
2个回答

1

你是否在AndroidManifest.xml中添加了这个?如果没有,可以尝试添加此内容。这解决了我的问题。

android:hardwareAccelerated="true" 

0
不要在另一个 Recycler View 中使用 Recycler View 作为父视图,因为父视图会尝试绘制整个子视图,从而导致卡顿。请尝试使用不同的视图类型创建一个 Recycler View。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接