我创建小应用程序来显示我的问题。您可以在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)和图像,而不需要更改。但它会眨眼。
我有能力不眨眼地更改文本吗?
使用方形布局将行布局文件括起来,如
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。 当新消息到达时,我使用此代码向下滚动到最后一个条目: 现在的问题是:如果用户已经向上滚动阅读旧消息,它不应该向下滚动。怎么才能检测出来?