gpt4 book ai didi

android - RecyclerView Viewholder 重用

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:04 24 4
gpt4 key购买 nike

我正在创建一个 RecyclerView,它会在用户触摸它时自行展开,并在用户再次触摸它时自行关闭。下面是我的代码:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecViewHolder> {
ArrayList<String> values;
ArrayList<Integer> expandedPosition;
public static class RecViewHolder extends RecyclerView.ViewHolder {
...
private boolean resultsOpened = false;
...
RelativeLayout favHeaderLayout;
RelativeLayout favResultsLayout;

public RecViewHolder (View itemView) {
super(itemView);
favHeaderLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!resultsOpened) {
expandLayout();
} else {
favResultsLayout.setVisibility(View.GONE);
resultsOpened = false;
}
}
});

}

public void expandLayout() {
favResultsLayout.setVisibility(View.VISIBLE);
resultsOpened = true;
//I populate my expanded layout here
}
}

public RecyclerViewAdapter (Context context, ArrayList<String> values) {
this.context = context;
this.values= values;
}

@Override
public RecViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_file, parent, false);
RecViewHolder recViewHolder= new RecViewHolder(v);
return recViewHolder;
}

@Override
public void onBindViewHolder(RecViewHolder recViewHolder , int position) {
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}

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

}

当我触摸第一个 View 时,它应该会自行展开。但是,当适配器有更多数据并且我触摸第一个 View 时,该 View 会展开,并且 RecyclerView 底部的另一个 View (例如第 8 个 View )也会展开。我如何确保只有被触摸的 View 展开而另一个保持关闭?

编辑

我已经尝试将展开的 View 位置存储在数组列表和 onBindViewHolder 中,检查哪些 View 已展开并仅展开它们:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecViewHolder> {
ArrayList<String> values;
ArrayList<Integer> expandedPosition;
public static class RecViewHolder extends RecyclerView.ViewHolder {
...
private boolean resultsOpened = false;
...
RelativeLayout favHeaderLayout;
RelativeLayout favResultsLayout;

public RecViewHolder (View itemView) {
super(itemView);


}

}

public RecyclerViewAdapter (Context context, ArrayList<String> values) {
this.context = context;
this.values= values;
}

@Override
public RecViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_file, parent, false);
RecViewHolder recViewHolder= new RecViewHolder(v);
return recViewHolder;
}

@Override
public void onBindViewHolder(RecViewHolder recViewHolder , int position) {
recViewHolder.favResultsLayout.setVisibility(View.GONE);
for(int i= 0; i < expandedPosition.size(); i ++){
recViewHolder.favResultsLayout.setVisibility(View.VISIBLE);
}
recViewHolder.favHeaderLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!expandedPosition.contains(position)) {
expandLayout(recViewHolder);
expandedPosition.add(position);
} else {
recViewHolder.favResultsLayout.setVisibility(View.GONE);
for(int i = 0; i < expandedPosition.size(); i ++){
if (expandedPosition.get(i) == position){
expandedPosition.remove(i);
}
}
}
}
});
}
public void expandLayout() {
favResultsLayout.setVisibility(View.VISIBLE);
//I populate my expanded layout here
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}

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

}

仍然没有运气:(

最佳答案

正如类(class)名称所说,这一切都是关于回收...

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecViewHolder> {
ArrayList<String> values;
SparseBooleanArray expanded = new SparseBooleanArray();
public static class RecViewHolder extends RecyclerView.ViewHolder {
//EDIT!!!!!
public RecViewHolder (View itemView, final RecyclerViewAdapter adapter) {
//rest of the code ...
favHeaderLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int currentPosition = getAdapterPosition();
//is a view at current position expanded?
if(adapter.expanded.get(currentPosition ))
//if so it shouldn't be
adapter.expanded.delete(getAdapterPosition(currentPosition));
else
//if not, expand
adapter.expanded.put(currentPosition, true);
//wheeee inform the adapter to rebind
adapter.notifyItemChanged(currentPosition);
//setupExpanded(expanded.get(currentPosition));
}
});
}
protected void setupExpanded(boolean state) {
//ONLY hide show layouts based on state
}
}
@Override
public RecViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_file, parent, false);
RecViewHolder recViewHolder= new RecViewHolder(v, this);
return recViewHolder;
}

@Override
public void onBindViewHolder(RecViewHolder recViewHolder , int position) {
//this line should be self explanatory
recViewHolder.setupExpanded(expanded.get(position));
}

//rest of the code
}

关于android - RecyclerView Viewholder 重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30759016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com