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

如何停止回收人员视图回收被切换为可见和消失的物品

周涵畅
2023-03-14

我已经在我的应用程序中成功实现了RecyclerView。RecyclerView有三项,即标题(TextView)、图像按钮和描述(TextView)。

标题和图像按钮始终可见,而通过单击图像按钮切换描述的可见性(默认设置为“已消失”)。

我遇到的问题是,当您单击一个项目中的ImageButton并且描述变得可见时,当您向下滚动或向上滚动时,即使我没有单击ImageButton以使其可见,第五个(向上或向下)项目也会使其描述可见。

book_card.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardCornerRadius="4dp"
    card_view:cardElevation="4dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/book_image"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:id="@+id/book_title"
            android:textStyle="bold"/>

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_arrow_name"
            android:id="@+id/arrow_button"
            android:layout_below="@+id/book_title"
            android:layout_centerHorizontal="true"
            android:onClick="onArrowClick"
            android:padding="5dp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/arrow_button"
            android:visibility="gone"
            android:id="@+id/book_descrip"/>

    </RelativeLayout>

</android.support.v7.widget.CardView>

预订项目

public class BookItems implements Parcelable, Collection<BookItems> {
    private String book_title;
    private String book_descrip;

    public String getBook_title() {
        return book_title;
    }

    public void setBook_title(String book_title) {
        this.book_title = book_title;
    }

    public String getBook_descrip() {
        return book_descrip;
    }

    public void setBook_descrip(String book_descrip) {
        this.book_descrip = book_descrip;
    }
    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.book_title);
        dest.writeString(this.book_descrip);
    }

    public BookItems() {
    }

    protected BookItems(Parcel in) {
        this.book_title = in.readString();
        this.book_descrip = in.readString();
    }

    public static final Parcelable.Creator<BookItems> CREATOR = new Parcelable.Creator<BookItems>() {
        @Override
        public BookItems createFromParcel(Parcel source) {
            return new BookItems(source);
        }

        @Override
        public BookItems[] newArray(int size) {
            return new BookItems[size];
        }
    };

    @Override
    public boolean add(BookItems object) {
        return false;
    }

    @Override
    public boolean addAll(Collection<? extends BookItems> collection) {
        return false;
    }

    @Override
    public void clear() {

    }

    @Override
    public boolean contains(Object object) {
        return false;
    }

    @Override
    public boolean containsAll(Collection<?> collection) {
        return false;
    }

    @Override
    public boolean isEmpty() {
        return false;
    }

    @NonNull
    @Override
    public Iterator<BookItems> iterator() {
        return null;
    }

    @Override
    public boolean remove(Object object) {
        return false;
    }

    @Override
    public boolean removeAll(Collection<?> collection) {
        return false;
    }

    @Override
    public boolean retainAll(Collection<?> collection) {
        return false;
    }

    @Override
    public int size() {
        return 0;
    }

    @NonNull
    @Override
    public Object[] toArray() {
        return new Object[0];
    }

    @NonNull
    @Override
    public <T> T[] toArray(T[] array) {
        return null;
    }
}

BookAdapter

public class BookAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    private Context mContext;
    private OnItemClickedListener mItemClickedListener;

    //List of books
    private List<BookItems> mBookItems;

    private int lastPosition = -1;


    public BookAdapter(List<BookItems> bookItems, Context context) {
        super();

        //Getting all books
        this.mBookItems = bookItems;
        this.mContext = context;
        this.mItemClickedListener = null;
    }

    public void setItemClickedListener (OnItemClickedListener onItemClickedListener) {
        this.mItemClickedListener = onItemClickedListener;
    }


    @Override
    public RecyclerView.ViewHolder  onCreateViewHolder (ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.book_card, parent, false);
            return new CardViewHolder(v);
    }


    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            final BookItems bookList = mBookItems.get(position);
            ((CardViewHolder) holder).bookTitle.setText(Html.fromHtml(bookList.getBook_title()));
            ((CardViewHolder) holder).bookDescrip.setText(Html.fromHtml(bookList.getBook_descrip()));

            ((CardViewHolder) holder).bookDescrip.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mItemClickedListener != null) {
                        mItemClickedListener.onItemClicked(bookList.getBookId(), "Book");
                    }
                }
            });

            ((CardViewHolder) holder).bookTitle.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mItemClickedListener != null) {
                        mItemClickedListener.onItemClicked(bookList.getBookId(), "Book");
                    }
                }
            });
            setAnimation(holder.itemView, position);
    }

    private void setAnimation(View viewToAnimate, int position) {
        if (position > lastPosition) {
            Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.recycler_anim_up);
            viewToAnimate.startAnimation(animation);
            lastPosition = position;
        }
    }

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

    @Override
    public void onViewDetachedFromWindow(final RecyclerView.ViewHolder holder) {
        holder.itemView.clearAnimation();
    }

    public class CardViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        @BindView(R.id.book_title) TextView bookTitle;
        @BindView(R.id.book_descrip) TextView bookDescrip;
        @BindView(R.id.arrow_button) ImageButton imageButton;

        public CardViewHolder (final View bookView) {
            super(bookView);
            ButterKnife.bind(this, bookView);
            imageButton.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (v.getId() == imageButton.getId()) {
                int visibility = bookDescrip.getVisibility();
                if (visibility == View.VISIBLE) {
                    bookDescrip.setVisibility(View.GONE);

                } else {
                    bookDescrip.setVisibility(View.VISIBLE);
                }
            }
        }

    }
}

请问有没有阻止这种不当行为?

共有1个答案

魏松
2023-03-14

我遵循了塔索斯的建议,这就是它被修复的方式。

在BookItem中,我添加了以下内容:

private boolean descVisible = false;

public boolean isDescVisible() {
    return descVisible;
}

public void setDescVisible(boolean descVisible) {
    this.descVisible = descVisible;
}

然后在BookAdapter onBindViewHolder中,我这样做了:

if (bookList.isVisible()) {
            ((CardViewHolder) holder).bookDescrip.setVisibility(View.VISIBLE);
        } else {
            ((CardViewHolder) holder).bookDescrip.setVisibility(View.GONE);
        }

        ((CardViewHolder) holder).imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (bookList.isDescVisible()) {
                    ((CardViewHolder) holder).bookDescrip.setVisibility(View.GONE);
                    bookList.setDescVisible(false);

                } else {
                    ((CardViewHolder) holder).bookBody.setVisibility(View.VISIBLE);
                    bookList.setDescVisible(true);
                }
            }
        });
 类似资料:
  • 我已经被困在这个问题上几天了,真的需要一些帮助和理解如何用DiffUtil设置RecylerView(RV),似乎无论我尝试什么,我都无法让RV更新。我会浏览我所拥有的,希望有人能解释一下我做错了什么。 应用程序启动 创建视图模型, 然后在ViewModel中填充LiveDataList。 LayoutManager和ListAdapter应用于RV 为什么在LiveDataList中添加或删除一

  • 我有一个像相册这样的项目列表,我通过RecyclerView显示它。 此外,每个项目都有一个按钮,通过单击该按钮可以向服务器发送一些数据,然后滚动到列表中的下一个位置。 所以我的问题是: 如果调用了smoothScrollToPosition()方法,如何防止RecyclerView手动滚动(手势),但滚动到某个位置?

  • 是否可以将可展开的列表项与新的 RecyclerView 一起使用?喜欢 ExpandableListView?

  • 我开始从clic项目recyclerview为我的所有人员列表发送数据,但我需要使用activity 2中的一些信息,我只是传递人员的姓名 Nb:person对象(id,name,phone,email,post) 这是click item Recolyer视图适配器的代码 @override public void onClick(View v){ */Context.StartActivity

  • 我正在实现N个项目的回收器视图,但我想在列表中只显示3个项目。此外,我已经为回收器视图设置了spanCount,但它不起作用

  • 我有一个recycle view,用户可以在其中将一个项目拖放到recycle view中的不同位置。 到目前为止,一切正常。 我的问题始于RecyclerView中的项目超过了它可以显示的数量。所以当它回收他的内容时。当用户将项目拖放到不同的位置,然后滚动离开该零件时,不会保存位置更改。用户只看到项目的旧位置。 您可以在下面的.gif中看到此问题。 我已经尝试了几件事,比如: 和 在我的onBi