当前位置: 首页 > 知识库问答 >
问题:

java.lang.IllegalArgumentException:废弃或附加的视图可能不会被回收。isS落下:假isAttated:向下滚动时为真

刁越
2023-03-14

致命异常:主进程:com.zipato.android.client.v2,PID:24966 java.lang.IllegalArgumentException:废弃或附加的视图可能无法回收。isScrap:false isAttached:true at android.support.v7.widget.RecyclerView$Recycler.recycleViewHolderInternal(RecyclerView.java:5736) at android.support.v7.widget.RecyclerView$Recycler.recycleView(RecyclerView.java:5680) at android.support.v7.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:289) at android.support.v7.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:336) at android.support.v7.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:349) at android.support.v7.widget.GapWorker.prefetch(GapWorker.java:356) at android.support.v7.widget.GapWorker.run(GapWorker.java:387) at android.os.handler.handleCallback(Handler.java:739) at android.os.handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5226) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

当我向下滚动时,应用程序一直崩溃..

这是我的适配器的样子:

public class WalletAdapter extends SectioningAdapter {

static final boolean USE_DEBUG_APPEARANCE = false;


private List<Transaction> transactions;
private List<Section> sections = new ArrayList<>();

public WalletAdapter() {
}

private class Section {
    String alpha;
    List<Transaction> transactions = new ArrayList<>();
}

public List<Transaction> getTransactions() {
    return transactions;
}

public void setTransactions(List<Transaction> transactions) {
    this.transactions = transactions;
    sections.clear();

    String mDate = "31.12.2222";

    Section currentSection = null;
    for (Transaction transaction : transactions) {
        String date = parseDate(transaction.getCreatedDate());
        if (!date.equals(mDate)) {
            if (currentSection != null) {
                sections.add(currentSection);
            }

            currentSection = new Section();
            mDate = date;
            currentSection.alpha = String.valueOf(mDate);
        }

        if (currentSection != null) {
            currentSection.transactions.add(transaction);
        }
    }

    sections.add(currentSection);
    notifyAllSectionsDataSetChanged();
}

private String parseDate(Date date) {
    DateFormat df = new SimpleDateFormat("dd.MM.yyyy", Locale.getDefault());
    String formattedDate = "";
    formattedDate = df.format(date);
    return formattedDate;
}

@Override
public int getNumberOfSections() {
    return sections.size();
}

@Override
public boolean doesSectionHaveHeader(int sectionIndex) {
    return sectionIndex == 0 || !parseDate(transactions.get(sectionIndex).getCreatedDate()).equals(parseDate(transactions.get(sectionIndex - 1).getCreatedDate()));
}

@Override
public boolean doesSectionHaveFooter(int sectionIndex) {
    return false;
}

@Override
public int getNumberOfItemsInSection(int sectionIndex) {
    return sections.get(sectionIndex).transactions.size();
}

@Override
public ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int itemUserType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View v = inflater.inflate(R.layout.wallet_item, parent, false);
    return new ItemViewHolder(v);
}

@Override
public HeaderViewHolder onCreateHeaderViewHolder(ViewGroup parent, int headerUserType) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View v = inflater.inflate(R.layout.wallet_header, parent, false);
    return new HeaderViewHolder(v);
}

@Override
public void onBindItemViewHolder(SectioningAdapter.ItemViewHolder viewHolder, int sectionIndex, int itemIndex, int itemType) {
    super.onBindItemViewHolder(viewHolder, sectionIndex, itemIndex, itemType);
    Section section = sections.get(sectionIndex);
    ItemViewHolder holder = (ItemViewHolder) viewHolder;
    Transaction transaction = section.transactions.get(itemIndex);
    holder.description.setText(transaction.getDescription());
    holder.ammount.setText(String.valueOf(transaction.getAmount()));
    holder.time.setText(parseDate(transaction.getCreatedDate()));
    holder.total.setText(String.valueOf(transaction.getNewCredits()));
}


@Override
public void onBindHeaderViewHolder(SectioningAdapter.HeaderViewHolder viewHolder, int sectionIndex, int headerType) {
    super.onBindHeaderViewHolder(viewHolder, sectionIndex, headerType);
    Section s = sections.get(sectionIndex);
    HeaderViewHolder hvh = (HeaderViewHolder) viewHolder;

    if (USE_DEBUG_APPEARANCE) {
        hvh.itemView.setBackgroundColor(0x55ffffff);
        hvh.dateHeader.setText(pad(sectionIndex * 2) + s.alpha);
    } else {
        hvh.dateHeader.setText(s.alpha);
    }
}

private String pad(int spaces) {
    StringBuilder b = new StringBuilder();
    for (int i = 0; i < spaces; i++) {
        b.append(' ');
    }
    return b.toString();
}

public class HeaderViewHolder extends SectioningAdapter.HeaderViewHolder {

    TextView dateHeader;

    public HeaderViewHolder(View itemView) {
        super(itemView);
        dateHeader = (TextView) itemView.findViewById(R.id.date);
    }
}

public class ItemViewHolder extends SectioningAdapter.ItemViewHolder {

    TextView description;
    TextView time;
    TextView ammount;
    TextView total;

    public ItemViewHolder(View itemView) {
        super(itemView);
        description = (TextView) itemView.findViewById(R.id.description);
        time = (TextView) itemView.findViewById(R.id.time);
        ammount = (TextView) itemView.findViewById(R.id.ammount);
        total = (TextView) itemView.findViewById(R.id.new_credits);
    }
}

}

这是我的活动的 xml 布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.zipato.appv2.activities.WalletActivity">

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    android:elevation="4dp"
    android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

以及活动onCreate中的代码

 recyclerView.setHasFixedSize(false);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(adapter);

共有2个答案

郎泰平
2023-03-14

覆盖适配器中的 getItemId 方法,如下所示

 @Override
    public long getItemId(int position) {
        return position;
    }
齐甫
2023-03-14

有同样的问题,但没有找到原因...似乎是支持库中的错误。您可以尝试为布局管理器禁用项目预取:

layoutManager.setItemPrefetchEnabled(false);

为我解决了这个问题!

 类似资料:
  • 当我滚动我的回收器视图太快时,我得到以下崩溃 我已经尽了最大努力,在stackoverflow上得到了类似的问题,但是没有一个像下面的链接一样有帮助, 链接1 链接2 链接3 链接4 链接5 我不知道这次崩溃是从哪里发生的。任何帮助将不胜感激。我既没有使用“android:animateLayoutChanges=”true” 基本上,我试图合并这两个不同的GitHub项目, RV适配器状态 rv

  • 我有一个动态填充的RecyclerView。 当新消息到达时,我使用此代码向下滚动到最后一个条目: 现在的问题是:如果用户已经向上滚动阅读旧消息,它不应该向下滚动。怎么才能检测出来?

  • 我使用的是一个从Android网站上获得的的简单实现,使用的是一个,但我不断收到这个导致我的应用崩溃的错误: 所谓简单,我的字面意思是,它是从他们网站上的这个页面上获得的相同实现,唯一的区别是我的网格项的布局是一个和两个,所以我不会麻烦重新发布我的代码。 还有谁知道这个错误并知道如何处理它?

  • 我看了很多问题,但列出的解决方案都没有解决我的问题:Scrollview不会滚动到底部的空白处 ScrollView不会滚动到底部 (Android) ScrollView不会一直滚动到我的线性布局的底部 我有一个具有以下布局的应用程序,其中包含ScrollView中的LinearLayout 基本上,这个布局被用于一个片段。在这个片段中,我用查询网站得到的字符串为tvPowers和tvAbili

  • 问题在于,当软键盘出现或消失时,recyclerview几乎向下滚动一整行。 这里有一个直观的例子: 活动的布局使用ChatKit UI库中的MessageInput和MessageList对象,如下所示: 该活动还在清单中设置了 adjustPan: Recyclerviews线性布局管理器设置为垂直,具有反向布局和默认项目animator: 理想情况下,我不想设置键盘侦听器并在每次显示/隐藏键

  • 问题内容: 有什么方法可以保证应用程序不会在Oracle中释放行锁吗?如果我确保将commit语句放在finally块中,则可以处理意外错误的情况,但是如果应用程序进程在提交前突然中断(或者有人将电源线/局域网电缆拔出),该怎么办。 有没有办法让Oracle在X时间后自动回滚空闲会话?还是在我以某种方式检测到连接丢失时回滚? 根据我所做的实验,如果我在提交某个应用程序进程之前终止了该进程,则行锁将