【问题标题】:RecyclerView.Adapter get ItemView through positionRecyclerView.Adapter 通过位置获取ItemView
【发布时间】:2016-12-15 10:15:16
【问题描述】:

在我的适配器中,我调用LayoutManager.ChildAt(position) 来获取itemview,但我得到的视图不是匹配的itemview,当我调用notifyItemChanged(position) 时,应用程序崩溃:

E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.paicaifu.riches, PID: 8502
Java.lang.IllegalArgumentException: Called attach on a child which is not detached: ViewHolder{adb21588 position=0 id=-1, oldPos=-1, pLpos:-1}
at Android.support.v7.widget.RecyclerView$5.attachViewToParent(RecyclerView.java:654)
at android.support.v7.widget.ChildHelper.attachViewToParent(ChildHelper.java:239)
at android.support.v7.widget.RecyclerView.addAnimatingView(RecyclerView.java:1107)
at android.support.v7.widget.RecyclerView.animateChange(RecyclerView.java:3270)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep3(RecyclerView.java:3088)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2917)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3283)
…
at android.view.Choreographer.doCallbacks(Choreographer.java:574) 

谢谢,这是我在适配器中的代码:

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, 
    final int position) {
    if (holder instanceof CardHolder) {
       final CardHolder cardHolder = (CardHolder) holder;
       cardHolder.rootview.setOnClickListener(this);
       cardHolder.rootview.setTag(position);
       cardHolder.rootview.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
         //get last itemview in adapter,but preView isnot match the
         //position,it is the visibable views on screen
         View preView = mLinearLayoutManager.getChildAt(preIndex);
         //change the datasource
         mData.getResult().getCardList().get(preIndex).setOpen(false);
         //update item
         notifyItemChanged(preIndex);//when the item is out of screen,
         //this line will cause crashes
         preIndex = position;
                    }
          });
      }

我只想找到最后一个项目并改变它的状态(打开或关闭),当项目超出屏幕时,notifyItemChanged(int position)会出现问题。

【问题讨论】:

  • 嘿,这个问题相当广泛。您能否将相关代码放在问题中您的适配器、视图持有者和活动/片段的区域?
  • 感谢您的帮助,请原谅我的英文不好和没有格式化的代码,我会在这些方面取得进展

标签: android-recyclerview android-adapter


【解决方案1】:

这可能有点太晚了,但是当您没有在onCreateViewHolder 中创建新视图而是返回一个已经膨胀和附加的缓存视图时,通常会发生“在未分离的孩子上调用附加”的崩溃.

【讨论】:

  • 有没有办法缓存视图而不致崩溃?
猜你喜欢
  • 2017-01-24
  • 2015-10-26
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多