我有一个用于创建回收者视图的数据集,并且其中的元素具有“已解决”的布尔值。初始化recyclerview后,所有内容都会正确显示。当我慢慢滚动浏览大部分图像时,相应的图像会正确显示,但其中一些图像会闪烁并从视图中消失。如果我快速滚动,那么基本上所有内容都会混乱。
private class RegularCrimeHolder extends CrimeHolder implements View.OnClickListener{
private Crime mCrime;
private TextView mTitleTextView;
private TextView mDateTextView;
public RegularCrimeHolder(LayoutInflater inflater, ViewGroup parent) {
super(inflater.inflate(R.layout.list_item_crime, parent, false));
mTitleTextView = this.itemView.findViewById(R.id.crime_title);
mDateTextView = this.itemView.findViewById(R.id.crime_date);
mSolved = this.itemView.findViewById(R.id.solved);
itemView.setOnClickListener(this);
}
//Optional
public void bind(Crime crime){
mCrime = crime;
mTitleTextView.setText(mCrime.getTitle());
mDateTextView.setText(mCrime.getDate().toString());
mSolved.setVisibility(crime.isSolved()? View.VISIBLE : View.GONE);
}
@Override
public void onClick(View view) {
//Toast toast = Toast.makeText(getActivity(), mCrime.getTitle() + " clicked!", Toast.LENGTH_SHORT);
//toast.show();
Intent intent = CrimeViewPagerActivity.newIntent(mCrime.getID(), getContext(), CrimeLab.GetIndex(mCrime));
startActivityForResult(intent, REQUEST_CRIME);
}
}
private class CrimeAdapter extends RecyclerView.Adapter<CrimeHolder>{
private List<Crime> mCrimes;
public CrimeAdapter(List<Crime> crimes){
mCrimes = crimes;
this.setHasStableIds(true);
}
@Override
public long getItemId(int position){
return position;
}
@Override
public CrimeHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
if(viewType == 0)
return new RegularCrimeHolder(layoutInflater, viewGroup);
else
return new BadCrimeHolder(layoutInflater, viewGroup);
}
@Override
public int getItemViewType(int position) {
if(mCrimes.get(position).RequiresPolice())
return 1;
else
return 0;
}
@Override
public void onBindViewHolder(@NonNull CrimeHolder crimeHolder, int i) {
Crime crime = mCrimes.get(i);
crimeHolder.bind(crime);
}
@Override
public int getItemCount() {
return mCrimes.size();
}
}
答案 0 :(得分:0)
别担心!凉!在您的适配器中,只需执行以下操作
科特林
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getItemViewType(position: Int): Int {
return position
}
Java
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
答案 1 :(得分:0)
您的示例代码缺少细节。发布完整的适配器查看器和项目布局代码。
但是,如果我不得不在这里猜测,您的布局混乱了,并且onViewRecycled不能正确清理。
例如,假设仅使用了一个视口,并将可见性设置为可见。现在,当该视图支架被回收并重新绑定时,您将看到闪烁。因为该视图在最后一个绑定中可见,因此需要在该绑定中隐藏自身。
您想要做的是在onViewRecycled内部,您希望将可见性设置为“ gone”,以便在重复使用视图持有者时不会出现闪烁。