Reusing a reusable RecyclerView resource
I am creating RecyclerView
that will expand when the user touches it and close when the user touches it again. Below is my code:
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();
}
}
When I touch the first view, it should expand. However, when the adapter has more data and I touch the first view, the view expands and another view at the bottom RecyclerView
(like the 8th view) also expands. How can I make sure that only the views that have been touched expand, the rest remains closed?
EDIT
I tried to store the expanded position of Views in an arraylist and in onBindViewHolder
, check which views are expanded and only expand them:
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();
}
}
Still no luck :(
source to share
As the name of the class says, it is about recycling ...
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
}
source to share