Swi*_*syn 26 android android-viewholder android-recyclerview
我正在使用RecyclerView显示标记列表,并且值的每个标记都显示为CardView.但是,在向下滚动RecyclerView并向后滚动之后,卡片的某些内容会丢失,如下面的两个屏幕截图所示.滚动后,红色矩形中的内容将丢失.
在滚动之前;

在滚动之后;

我想知道它是否是RecyclerView的一个错误,并在谷歌搜索后找不到解决方案.
除标题外,所有观点都是看不见的,它们的可见性取决于标记的价值.
有谁知道为什么会这样?
aph*_*hoe 33
在与同样的问题进行了大约24小时的斗争之后,我发现了一个对我有用的解决方案.关键是使用类的setIsRecyclable()方法RecyclerView.ViewHolder.
这是我的onBindViewHolder()代码的一部分.
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
final DataSource dataSource = dataSourceList.get(position);
holder.setIsRecyclable(false);
holder.name.setText(dataSource.getName());
holder.active.setChecked(dataSource.getActive());
String logoStr = dataSource.getLogo();
//Logo
/**
* Do all the logo insertion stunts here
*/
/**
* Register the changes to the Switch
*/
holder.active.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked){
dataSource.setActive(isChecked);
}
});
}
Run Code Online (Sandbox Code Playgroud)
Emr*_*ürk 29
onBindHolder多次调用,因为回收者需要一个视图,除非在视图类型的情况下更改了新视图.因此,每次在子视图中设置相关性时,其他视图状态也会发生变化.
无论何时向上和向下滚动,这些视图都会被错误的可见性选项重新绘制.
方案:
您有一个setValue方法检查值并设置为查看.如果需要,它会调用另一个方法"showView".你需要实现else语句(值为0或null)并在那里隐藏View ...
void setValue(Object value, TextView textView, TableRow row, View seperator) {
if (value != null) {
if (!isEmpty(value.toString())) {
textView.setText(String.valueOf(value));
showViews(row, seperator);
}
} else
hideViews(row, seperator);
}
private void showViews(TableRow row, View seperator) {
row.setVisibility(View.VISIBLE);
seperator.setVisibility(View.VISIBLE);
}
private void hideViews(TableRow row, View seperator) {
row.setVisibility(View.INVISIBLE); // if there is a empty space change it with View.GONE
seperator.setVisibility(View.INVISIBLE);
}
Run Code Online (Sandbox Code Playgroud)
Sac*_*are 13
onBindHolder多次调用,因为Recycler View需要一个视图,除非是新视图.因此,每次在子视图中设置相关性时,其他视图状态也会发生变化.
无论何时向上和向下滚动,都会使用错误的可见性选项重新绘制这些视图,因此始终指定这两个条件会导致回收器视图不知道我们的小部件的先前状态/条件/值.
方案:
如果在If块中设置任何android widget.setVisibility(View.Gone)的可见性,那么在else块中你必须设置它的可见性,与widget.setVisibility(View.Visible)相反,以克服上述问题.
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
viewHolder.tvName.setText(ModelCategoryProducts.name.get(i));
viewHolder.tvPrice.setText("Rs."+String.format("%.2f", Float.parseFloat(ModelCategoryProducts.price.get(i))));
if(ModelCategoryProducts.special_price.get(i).equals("null")) {
viewHolder.tvSpecialPrice.setVisibility(View.GONE); // here visibility is gone and in else it's opposite visibility i set.
viewHolder.tvPrice.setTextColor(Color.parseColor("#ff0000"));
viewHolder.tvPrice.setPaintFlags(0);// here paint flag is 0 and in else it's opposite flag that i want is set.
}else if(!ModelCategoryProducts.special_price.get(i).equals("null")){
viewHolder.tvPrice.setTextColor(Color.parseColor("#E0E0E0"));
viewHolder.tvSpecialPrice.setVisibility(View.VISIBLE);
viewHolder.tvSpecialPrice.setText("Rs." + String.format("%.2f", Float.parseFloat(ModelCategoryProducts.special_price.get(i))));
viewHolder.tvPrice.setPaintFlags(viewHolder.tvPrice.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
}
if (!ModelCategoryProducts.image_url.get(i).isEmpty()) {
Picasso.with(context)
.load(ModelCategoryProducts.image_url.get(i))
.into(viewHolder.ivProduct);
}
viewHolder.setClickListener(new ItemClickListener() {
@Override
public void onClick(View view, int position, boolean isLongClick) {
if (isLongClick) {
// Toast.makeText(context, "#" + position + " - " + ModelCategoryProducts.name.get(position) + " (Long click)", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "#" + position + " - " + ModelCategoryProducts.name.get(position), Toast.LENGTH_SHORT).show();
Intent i = new Intent(context, ProductDetail.class);
i.putExtra("position",position);
i.putExtra("flagHlvCheck", 5);
context.startActivity(i);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38837 次 |
| 最近记录: |