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

回收站和可扩展卡的奇怪故障[复制]

姬浩渺
2023-03-14

我正试图通过每条路线的小步行时间进入Android应用程序开发。
但一个小故障阻止了我继续。
我尝试谷歌了很多次,但没有结果,事情是这样的:

我使用<code>onClick expand cards</code>的<code>RecyclerView</code>显示了一种奇怪的行为,即一旦我在整个列表中添加了太多项,就会重新加载该列表。此外,它还会将整个列表向下移动一秒钟。作为参考,这里是我的github项目:https://github.com/TheInsayn/velocity

以下是它应该如何表现:
Imgur

但是在我添加了第6个项目后,它的行为如下:

伊姆古尔

以下是我用于适配器的代码(尤其是onBindViewHolderiExpanded):
我甚至使用了谷歌2016年I/O的参考建议。(我真的不想使用第三方库)

class RecyclerAdapterWalks extends RecyclerView.Adapter<RecyclerAdapterWalks.WalkCardHolder> {
private List<Walk> mWalkList;
private RecyclerView mRecyclerView;
private int mExpandedPosition = -1;

class WalkCardHolder extends RecyclerView.ViewHolder {
    TextView mWalkRoute;
    TextView mWalkDuration;
    TextView mWalkDate;
    TextView mWalkWeekday;
    RelativeLayout mExpansion;
    TextView mAverageTime;

    WalkCardHolder(View view) {
        super(view);
        mWalkRoute = view.findViewById(R.id.txt_walk_route);
        mWalkDuration = view.findViewById(R.id.txt_walk_duration);
        mWalkDate = view.findViewById(R.id.txt_walk_date);
        mWalkWeekday = view.findViewById(R.id.txt_walk_weekday);
        mExpansion = view.findViewById(R.id.walk_card_expansion);
        mAverageTime = view.findViewById(R.id.txt_walk_average);
    }
}

RecyclerAdapterWalks(List<Walk> routes, RecyclerView rv) {
    mWalkList = routes;
    mRecyclerView = rv;
    setHasStableIds(true);
}

@Override
public WalkCardHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_walk, parent, false);
    return new WalkCardHolder(view);
}

@Override
public void onBindViewHolder(WalkCardHolder holder, int position) {
    Walk walk = mWalkList.get(position);
    holder.mWalkRoute.setText(walk.getRoute().getName());
    holder.mWalkDuration.setText(DateFormat.format("mm:ss", new Date(walk.getDuration())));
    holder.mWalkDate.setText(DateFormat.format("dd.MM.yyyy", walk.getDate()));
    holder.mWalkWeekday.setText(DateFormat.format("EEEE", walk.getDate()));
    //handle expansion in list
    final boolean isExpanded = position == mExpandedPosition;
    holder.mExpansion.setVisibility(isExpanded ? View.VISIBLE : View.GONE);
    holder.itemView.setActivated(isExpanded);
    holder.itemView.setOnClickListener(v -> {
        mExpandedPosition = isExpanded ? -1 : position;
        TransitionManager.beginDelayedTransition(mRecyclerView);
        notifyDataSetChanged();
    });
    if (isExpanded) {
        Date avg = new Date(walk.getRoute().getAverageWalkTime(mRecyclerView.getContext()));
        CharSequence min = DateFormat.format("m", avg);
        CharSequence sec = DateFormat.format("s", avg);
        String boldText = walk.getRoute().getName();
        String timeStr = "average walk duration for " + boldText + ": ";
        if (!min.equals("0")) timeStr += min + "m and ";
        timeStr += sec + "s";
        int idx = timeStr.indexOf(boldText);
        SpannableString str = new SpannableString(timeStr);
        str.setSpan(new StyleSpan(Typeface.BOLD), idx, idx + boldText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        holder.mAverageTime.setText(str);
    }
}

@Override
public int getItemCount() {
    return mWalkList.size();
}

我在一个回收视图中有CardView,在一个坐标布局中有Card View,在相对位置中有FrameLayout。。。

有人知道是什么导致了这种情况吗?
很抱歉发了这么长的帖子,谢谢你的帮助。:)

编辑:在适配器的构造函数中使用 setHasStableIds(true) 似乎会有所帮助。但现在过渡远非顺利。
小列表(更糟):
Imgur
更长列表(更好):
Imgur

共有2个答案

燕俊明
2023-03-14

基于@napster的输入,我终于在一个老话题的帮助下解决了我的问题<我太相信尼克·布彻在I/O中的例子了<引用:“这是一个可怕的解决方案
使用来自https://stackoverflow.com/a/48092441/9165497一切都有所改善,我现在认为问题已经解决。

现在,我的代码看起来就是这样,一切都更加顺利,没有问题:

final boolean isExpanded = position == mExpandedPosition;
holder.mExpansion.setVisibility(isExpanded ? View.VISIBLE : View.GONE);
holder.itemView.setActivated(isExpanded);
if (isExpanded) mPreviousExpandedPosition = holder.getAdapterPosition();
holder.itemView.setOnClickListener(v -> {
    mExpandedPosition = isExpanded ? -1 : holder.getAdapterPosition();
    notifyItemChanged(mPreviousExpandedPosition);
    notifyItemChanged(holder.getAdapterPosition());
});
皇甫智明
2023-03-14

由于<code>notifyDataSetChanged(),它正在重新加载整个列表 行。这刷新了整个列表。如果您只添加了一个元素,我建议使用<code>notifyitemserted(int-position)

 类似资料:
  • 我想知道是否可以在Kafka制作程序中配置2个不同的Kafka集群。 目前我正试图让我的制片人 我正在使用Apache Kafka 2.8和Python 3.7的confluent_kafka==1.8.2包。 生产商代码下方: 当我杀死clusterB时,我得到了以下错误消息。

  • 问题内容: 在Python(2.7)中发现了从未有过的有趣的东西。 这个: 确实有效,结果是: 但 给 有人可以解释为什么吗?感谢您的回答。 问题答案: Python区分和运算符,并为它们提供了单独的挂钩。和。该类型只是为后者提供了不同的实现。 列表分别实现这些功能更为有效;必须返回一个全新的列表,而可以扩展然后返回。 在C代码中,是由所实现的,该只需调用,或者在python代码中,由。后者根据设

  • 我有一个XUIView课程,如下所示。运行动画时,对折叠没有效果。 谁能解释我? 源代码:http://www.mediafire.com/file/n6svp1mk44fc0uf/TestXUIView.zip/file

  • 对于复制,我们设置Server1作为主服务器,设置server2作为次服务器...一切正常。 期望:当server1停机时,次要的server2不会自动变成主要的。它仍然是次要的。server2也有可能自动成为主服务器。 情况2:MongoDB复制是否需要3台强制服务器,以便当server1宕机时,server2将自动成为主要服务器,server3将保持次要服务器。(这很管用)

  • 我需要制作一个可扩展的 ,每次点击只能打开一个项目(所有其他项目都必须关闭)。我知道有可能在的帮助下做到这一点,然后使用下一个代码: 但是有没有办法使用来做同样的事情?

  • 本文向大家介绍Android实现可收缩和扩展的TextView,包括了Android实现可收缩和扩展的TextView的使用技巧和注意事项,需要的朋友参考一下 在Android原生的TextView的基础上,可收缩/扩展的TextView:PhilExpandableTextView。 实现原理:核心是控制TextView的max lines。在TextView的初始化阶段但尚未绘制出View的时