我已经在我的应用程序中成功实现了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);
}
}
}
}
}
请问有没有阻止这种不当行为?
我遵循了塔索斯的建议,这就是它被修复的方式。
在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