I have a list of item as RecyclerView (expandable item) and I want to the item on list was moved/scrolled smoothly when clicked.
So let say that I have list as below on first screen and I click item "value 6". I want to achieve situation on second screen by smoothly scroll item "value 6" to top.
My Layout:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout >
<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar">
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/toolbar_layout"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
app:layout_collapseMode="pin" />
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
/>
</android.support.design.widget.CoordinatorLayout>
And my actual Adapter (it's inner class in ScrollingActivity which is for Google sample)
public class Adapter extends RecyclerView.Adapter<Adapter.ItemHolder> {
Container[] values;
public Adapter() {
values = new Container[100];
for (int i = 0; i < values.length; i++) {
values[i] = new Container();
values[i].text = "value " + i;
}
}
@Override
public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ItemHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false));
}
@Override
public void onBindViewHolder(ItemHolder holder, int position) {
holder.text.setText(values[position].text);
holder.more.setVisibility(values[position].visibility);
}
@Override
public int getItemCount() {
return values.length;
}
public class ItemHolder extends RecyclerView.ViewHolder {
private final TextView more; //it is expandable part
TextView text;
public ItemHolder(View itemView) {
super(itemView);
text = (TextView) itemView.findViewById(R.id.text);
more = (TextView) itemView.findViewById(R.id.more);
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = getAdapterPosition();
if (more.getVisibility() == View.VISIBLE) {
more.setVisibility(View.GONE);
values[pos].visibility = View.GONE;
} else {
more.setVisibility(View.VISIBLE);
values[pos].visibility = View.VISIBLE;
int vfpos = linearLayoutManager.findFirstCompletelyVisibleItemPosition();
int d = pos - vfpos;
recyclerView.smoothScrollToPosition(pos);
}
}
});
}
}
}
So what I miss?
I suppose that recyclerView.smoothScrollToPosition(pos)
do nothing because this item is actual on screen. But how to fix it?