Android:更改 cardView 在 recyclerView 中的可见性
Android: changing cardView visibility in recyclerView
我有一个 recyclerView,其中包含由同一布局中的 2 个 Cardview 呈现的项目。
当我点击一个 Cardview 时,我希望另一个 cardview 折叠或展开。
它有效,但是当我点击卡片 1 时,卡片 9,18... 也会展开。
我已经阅读了有关 stableId 和 getItemID 的内容,但在实施时仍然无法正常工作。
我现在正在使用 hashCode 来获取 itemId,因为我知道它是在我的数据集对象中实现的,并且我确信它 returns 是一个唯一的 ID。
这是代码:
RecyclerViewAdapter
public class ArrDepRecyclerViewAdapter extends RecyclerView.Adapter<ArrDepRecyclerViewAdapter.ArrDepListItemModelVH> {
private final boolean arrival;
private final List<AirportFlightContract> dataSet;
public ArrDepRecyclerViewAdapter(List<AirportFlightContract> dataSet, boolean arrival) {
this.dataSet = dataSet;
this.arrival = arrival;
setHasStableIds(true);
}
@NonNull
@Override
public ArrDepListItemModelVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_arr_dep_list_item7, parent, false);
return new ArrDepListItemModelVH(view);
}
@Override
public void onBindViewHolder(@NonNull ArrDepListItemModelVH holder, int position) {
//topCardView is the card on which I Click
//subCardView is the card which needs to expand/collapse
holder.getTopCardView().setOnClickListener(v->{
if (holder.getSubCardView().getVisibility() == View.GONE) {
holder.getSubCardView().setVisibility(View.VISIBLE);
} else {
holder.getSubCardView().setVisibility(View.GONE);
}
});
...
@Override
public int getItemCount() {
if (dataSet != null) {
return dataSet.size();
} else {
return 0;
}
}
@Override
public long getItemId(int position) {
return (long) dataSet.get(position).hashCode();
}
所以感谢对我的问题的评论,这里是这个问题的解决方案。
我在我的 modelObject 中添加了一个 isVisible 属性,并用它来设置 cardView 的可见性值。
这是代码:
@Override
public void onBindViewHolder(@NonNull ArrDepListItemModelVH holder, int position) {
AirportFlightContract airportFlightContract = dataSet.get(position);
//Set visibility of the card by checking it's model attribute
holder.getSubCardView().setVisibility(airportFlightContract.isVisible()?View.VISIBLE:View.GONE);
holder.getTopCardView().setOnClickListener(v->{
//Check model to see if the card is visible
if (!airportFlightContract.isVisible()) {
//Change visibility and update model
holder.getSubCardView().setVisibility(View.VISIBLE);
airportFlightContract.setVisible(true);
} else {
holder.getSubCardView().setVisibility(View.GONE);
airportFlightContract.setVisible(false);
}
});
我有一个 recyclerView,其中包含由同一布局中的 2 个 Cardview 呈现的项目。
当我点击一个 Cardview 时,我希望另一个 cardview 折叠或展开。
它有效,但是当我点击卡片 1 时,卡片 9,18... 也会展开。
我已经阅读了有关 stableId 和 getItemID 的内容,但在实施时仍然无法正常工作。
我现在正在使用 hashCode 来获取 itemId,因为我知道它是在我的数据集对象中实现的,并且我确信它 returns 是一个唯一的 ID。
这是代码:
RecyclerViewAdapter
public class ArrDepRecyclerViewAdapter extends RecyclerView.Adapter<ArrDepRecyclerViewAdapter.ArrDepListItemModelVH> {
private final boolean arrival;
private final List<AirportFlightContract> dataSet;
public ArrDepRecyclerViewAdapter(List<AirportFlightContract> dataSet, boolean arrival) {
this.dataSet = dataSet;
this.arrival = arrival;
setHasStableIds(true);
}
@NonNull
@Override
public ArrDepListItemModelVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_arr_dep_list_item7, parent, false);
return new ArrDepListItemModelVH(view);
}
@Override
public void onBindViewHolder(@NonNull ArrDepListItemModelVH holder, int position) {
//topCardView is the card on which I Click
//subCardView is the card which needs to expand/collapse
holder.getTopCardView().setOnClickListener(v->{
if (holder.getSubCardView().getVisibility() == View.GONE) {
holder.getSubCardView().setVisibility(View.VISIBLE);
} else {
holder.getSubCardView().setVisibility(View.GONE);
}
});
...
@Override
public int getItemCount() {
if (dataSet != null) {
return dataSet.size();
} else {
return 0;
}
}
@Override
public long getItemId(int position) {
return (long) dataSet.get(position).hashCode();
}
所以感谢对我的问题的评论,这里是这个问题的解决方案。
我在我的 modelObject 中添加了一个 isVisible 属性,并用它来设置 cardView 的可见性值。
这是代码:
@Override
public void onBindViewHolder(@NonNull ArrDepListItemModelVH holder, int position) {
AirportFlightContract airportFlightContract = dataSet.get(position);
//Set visibility of the card by checking it's model attribute
holder.getSubCardView().setVisibility(airportFlightContract.isVisible()?View.VISIBLE:View.GONE);
holder.getTopCardView().setOnClickListener(v->{
//Check model to see if the card is visible
if (!airportFlightContract.isVisible()) {
//Change visibility and update model
holder.getSubCardView().setVisibility(View.VISIBLE);
airportFlightContract.setVisible(true);
} else {
holder.getSubCardView().setVisibility(View.GONE);
airportFlightContract.setVisible(false);
}
});