我正在处理 Recycler View ,在其中我在适配器中使用 LinearLayout。当点击 LinearLayout 时,它隐藏了 View 并同样再次点击使其可见。我的问题是 Recycler View 没有保存 View 的状态,当我滚动时它再次刷新 View ,再次更改初始时间的状态 View 。
下面给出了我的 RecyclerView 代码和我的适配器。
RecyclerView 代码:
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
Menu_Detail_Adapter searchabledapter = new Menu_Detail_Adapter(getActivity());
RecyclerView mRecyclerView =(RecyclerView)view.findViewById(R.id.recycler_view);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setItemViewCacheSize(2);
mRecyclerView.setAdapter(searchabledapter);
mRecyclerView.setLayoutManager(layoutManager);
我的适配器代码:
public class Menu_Detail_Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {
public Menu_Detail_Adapter(Context context1) {
arrayList = new ArrayList<>();
arrlist = new ArrayList<>();
context = context1;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.kasib_o_karahi_list_view, parent, false);
return new MemberViewHolder(view, onItemClickListener);
}
String imageUrl = "";
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
final ParseObject parseObject = arrayList.get(position);
if(holder instanceof MemberViewHolder){
if (arrayList.size() > 0) {
try {
((MemberViewHolder) holder).linear_layout__add.setVisibility(View.VISIBLE);
((MemberViewHolder) holder).linear_layout_add_subtract_buttons.setVisibility(View.GONE);
// Here I am facing a problem
// On both LinearLayout click listeners when I am scrolling it
is again changing my View States
((MemberViewHolder) holder).rrl_add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((MemberViewHolder) holder).linear_layout__add.setVisibility(View.GONE);
((MemberViewHolder) holder).linear_layout_add_subtract_buttons.setVisibility(View.VISIBLE);
}
});
((MemberViewHolder) holder).rrl_minus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
((MemberViewHolder) holder).linear_layout__add.setVisibility(View.VISIBLE);
((MemberViewHolder) holder).linear_layout_add_subtract_buttons.setVisibility(View.GONE);
}
});
((MemberViewHolder) holder).rrl_add_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
} catch (Exception e) {
e.getMessage();
}
}
}
}
@Override
public int getItemCount() {
return arrayList == null ? 0 : arrayList.size();
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
super.onDetachedFromRecyclerView(recyclerView);
}
static class MemberViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView txtTitle;
TextView txtDescription;
TextView txtCountry;
OnItemClickListener onItemClickListener;
ImageView imgDescription;
LinearLayout linear_layout_add_subtract_buttons, linear_layout__add;
RelativeLayout rrl_add, rrl_minus, rrl_add_btn;
public MemberViewHolder(View itemView, OnItemClickListener onItemClickListener) {
super(itemView);
linear_layout_add_subtract_buttons = (LinearLayout) itemView.findViewById(R.id.add_subtract_buttons);
linear_layout__add = (LinearLayout) itemView.findViewById(R.id.ll_add);
rrl_add = (RelativeLayout) itemView.findViewById(R.id.rrl_add);
rrl_minus = (RelativeLayout) itemView.findViewById(R.id.rrl_minus);
rrl_add_btn = (RelativeLayout) itemView.findViewById(R.id.rrl_add_btn);
itemView.setOnClickListener(this);
this.onItemClickListener = onItemClickListener;
}
@Override
public void onClick(View v) {
onItemClickListener.onItemClick(v, getAdapterPosition());
}
}
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
}
最佳答案
一个问题是您的代码既不精简也不完整且可验证。所以我不得不编一个例子,你必须根据自己的需要采用它。
我所说的“单个对象数组”由 DataItem
类的对象组成与一个int
和两个 boolean
s 成员。
public class DataItem{
int dataItem;
boolean visible1;
boolean visible2;
public DataItem(int dataItem, boolean visible1, boolean visible2){
this.dataItem = dataItem;
this.visible1 = visible1;
this.visible2 = visible2;
}
}
onCreate()
在我的 Activity 中看起来像这样:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
int dataItemsLength = 50;
ArrayList<DataItem> dataItems = new ArrayList<>();
for (int i = 0; i < dataItemsLength; i++) {
dataItems.add(new DataItem(i, true, true));
}
RecyclerView rv = findViewById(R.id.rv);
Menu_Detail_Adapter adapter = new Menu_Detail_Adapter(this, dataItems);
rv.setLayoutManager(new LinearLayoutManager(this));
rv.setAdapter(adapter);
}
虽然在您的代码中不清楚您的数据来自何处,但在这里我选择了在 Activity 中“制作”数据(您可能想要“读取”它)并将其传递给适配器的方法。原则上,您也可以在适配器内部执行此操作。
我为 RecyclerView
使用了一个非常简单的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
项目的布局稍微复杂一些:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/rl1"
android:layout_width="match_parent"
android:layout_height="25dp"
android:background="@android:color/holo_orange_light">
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl2"
android:layout_width="match_parent"
android:layout_height="25dp"
android:background="@android:color/holo_orange_dark">
<TextView
android:id="@+id/tv2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
</LinearLayout>
最重要的是,适配器:
public class Menu_Detail_Adapter extends RecyclerView.Adapter<Menu_Detail_Adapter.ViewHolder> {
private ArrayList<DataItem> dataItems;
private final LayoutInflater inflater;
Menu_Detail_Adapter(Context context, ArrayList<DataItem> dataItems) {
this.dataItems = new ArrayList<>();
this.dataItems.addAll(dataItems);
this.inflater = LayoutInflater.from(context);
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(inflater.inflate(R.layout.list_item, parent, false));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.rl1.setVisibility(dataItems.get(position).visible1 ? View.VISIBLE : View.INVISIBLE);
holder.tv1.setText(String.valueOf(dataItems.get(position).dataItem));
holder.rl2.setVisibility(dataItems.get(position).visible2 ? View.VISIBLE : View.INVISIBLE);
}
@Override
public int getItemCount() {
return dataItems.size();
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
RelativeLayout rl1, rl2;
TextView tv1;
ViewHolder(View itemView) {
super(itemView);
rl1 = itemView.findViewById(R.id.rl1);
rl2 = itemView.findViewById(R.id.rl2);
rl1.setOnClickListener(this);
rl2.setOnClickListener(this);
tv1 = itemView.findViewById(R.id.tv1);
((TextView) itemView.findViewById(R.id.tv2)).setText("default");
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.rl1) {
if (view.getVisibility() == View.VISIBLE) {
view.setVisibility(View.INVISIBLE);
dataItems.get(getAdapterPosition()).visible1 = false;
} else {
view.setVisibility(View.VISIBLE);
dataItems.get(getAdapterPosition()).visible1 = true;
}
} else if (view.getId() == R.id.rl2) {
if (view.getVisibility() == View.VISIBLE) {
view.setVisibility(View.INVISIBLE);
dataItems.get(getAdapterPosition()).visible2 = false;
} else {
view.setVisibility(View.VISIBLE);
dataItems.get(getAdapterPosition()).visible2 = true;
}
}
}
}
}
关于适配器的一些评论:
确保不要对
onBindViewHolder()
中的任何可见性进行硬编码强>。请改用您的数据集。附上
onClickListener
s 在ViewHolder
的构造函数中 类。如果您愿意,可以将监听器添加为匿名类,并避免统一onClick
的 if 子句。方法。这主要是品味问题。在监听器内部,注意同时执行以下操作:刷新 View 和更新模型。这是关键点。
出于您的目的,请勿使用
notifyDataSetChanged
.只有在添加或删除DateItem
时才需要这样做来自ArrayList<DataItem>
称为dataItems
.
关于android - Recycler View 不保存 View 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47104414/