当前位置: 首页 > 知识库问答 >
问题:

滑动和回收视图闪烁

壤驷志学
2023-03-14

我创建小应用程序来显示我的问题。您可以在https://github.com/anton111111/exampleglideblink中看到它。

public class MainActivity extends AppCompatActivity {

    private Adapter adapter;
    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView rv = (RecyclerView) findViewById(R.id.recycler_view);
        rv.setHasFixedSize(true);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
        rv.setLayoutManager(gridLayoutManager);

        ArrayList<String> items = new ArrayList<>(Arrays.asList(new String[]{
                "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
                "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"
        }));

        adapter = new Adapter(this, items);
        rv.setAdapter(adapter);
        handler = new Handler();
        handler.postDelayed(r, 500);
    }

    Runnable r = new Runnable() {
        @Override
        public void run() {
            Random rand = new Random(System.currentTimeMillis());
            handler.postDelayed(r, 500);
            adapter.notifyItemChanged(rand.nextInt(4));
        }
    };

    public class Adapter extends RecyclerView.Adapter {

        private final Context ctx;
        private ArrayList<String> items = new ArrayList<>();
        private int progress = 1;

        public Adapter(Context context, ArrayList<String> items) {
            this.items = items;
            ctx = context;
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.item, parent, false);
            Holder h = new Holder(v);
            return h;
        }

        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            ((Holder) holder).getProgress().setText(progress+"");
            progress++;
            Glide.with(ctx)
                    .load(Uri.parse("file:///android_asset/" + (position + 1) + ".png"))
                    .into(((Holder) holder).getImage1());
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public int getItemCount() {
            return items.size();
        }

        public class Holder extends RecyclerView.ViewHolder {

            private final ImageView image1;
            private final TextView progress;

            public ImageView getImage1() {
                return image1;
            }

            public TextView getProgress() {
                return progress;
            }

            public Holder(View itemView) {
                super(itemView);
                image1 = (ImageView) itemView.findViewById(R.id.image1_view);
                progress = (TextView) itemView.findViewById(R.id.progress_text);
            }
        }
    }

}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.testglide.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/image1_view"
        android:layout_width="100dp"
        android:layout_height="100dp" />

    <TextView
        android:id="@+id/progress_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

当我调用RecyerView适配器上的notifyItemChanged时,我只需要更改文本(在我的示例中,它使用id r.id.progress EditText)和图像,而不需要更改。但它会眨眼。

我有能力不眨眼地更改文本吗?

共有1个答案

祝允晨
2023-03-14

使用方形布局将行布局文件括起来,如

public class SquaredFrameLayout extends FrameLayout {
public SquaredFrameLayout(Context context) {
    super(context);
}

public SquaredFrameLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public SquaredFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public SquaredFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, widthMeasureSpec);
}}

然后在xml中

<com.app_views.SquaredFrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/iv_answer_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:onClick="@{group.onHashTagPhotoClicked}"
        android:paddingEnd="1dp"
        android:paddingLeft="1dp"
        android:paddingRight="1dp"
        android:paddingStart="1dp"
        android:paddingTop="1dp"
        app:galleryImage="@{group.boothPhoto}" />
</com.app_views.SquaredFrameLayout>
 类似资料:
  • 我正在将Recyclerview与CardView一起使用我知道如何在列表视图上控制速度。但对于RecyclerView不是。 更新: 我用这个总结了吉尔的回答

  • 在其他回收器视图中有一个回收器视图。两者都需要垂直滚动。外部回收器视图滚动正常,但内部回收器视图滚动不正常。 这是代码: ViewAdapter如下: 我尝试了以下两种回收商观点,但都无法解决问题 也尝试了这个:

  • 我一直在看GridLayoutManager的留档和它的RecyclerView类。但是我无法了解SpanSizeLookUp类的getSpanGroupIndex和getSpanIndex方法。我还尝试了覆盖和返回任意数字(小于跨度计数)。但是我无法知道它是用来做什么的。 我无法理解文档说明。我想澄清一下。

  • 我有一个水平回收视图。每个子级包含一个TextView和一个垂直RecyclerView。垂直RecyclerView的子级仅包含TextView。 垂直滚动非常平滑,但水平滚动滞后很多。我已经尝试在onBindViewHolder中使用swapAdapter,而不是setAdapter,但这并没有解决问题。我也尝试过更改数据集并调用notifyDataSetChanged(),但这也没有帮助。

  • 我有一个动态填充的RecyclerView。 当新消息到达时,我使用此代码向下滚动到最后一个条目: 现在的问题是:如果用户已经向上滚动阅读旧消息,它不应该向下滚动。怎么才能检测出来?