滚动时,Recycler View无法使用提供的布尔值一致地更新视图

时间:2019-06-25 03:44:15

标签: java android android-recyclerview

我有一个用于创建回收者视图的数据集,并且其中的元素具有“已解决”的布尔值。初始化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();
    }

}

2 个答案:

答案 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”,以便在重复使用视图持有者时不会出现闪烁。