Добавить вид в начало в LinearLayoutManager
Я строю круговой однонаправленный LinearLayoutManager, поэтому всякий раз, когда достигается начало RecyclerView, я хочу добавить последний элемент в начало.
Я пытался использовать scrollHorizontallyBy()
а также addView()
методы, но это не работает, как ожидалось.
Любое предложение?
Вот код:
public class CircularLinearLayoutManager extends LinearLayoutManager {
public CircularLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
//Only horizontal scrolling is allowed.
@Override
public boolean canScrollHorizontally() {
return true;
}
@Override
public boolean canScrollVertically() {
return false;
}
@Override
public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {
if (findFirstVisibleItemPosition() == 0) {
addView(recycler.getViewForPosition(getItemCount()-1), 0);
}
return super.scrollHorizontallyBy(dx, recycler, state);
}
Результат после прокрутки в начало выглядит так:
Вот файл макета для действия:
<?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="match_parent"
android:gravity="center_horizontal"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"/>
</LinearLayout>
И это файл макета для элемента:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">
<View
android:id="@+id/colorView"
android:layout_width="100dp"
android:layout_height="50dp"/>
<TextView
android:id="@+id/colorName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"/>
</LinearLayout>
Вот код для основной деятельности:
public class MainActivity extends AppCompatActivity implements MyRecyclerViewAdapter.ItemClickListener{
private MyRecyclerViewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<Integer> viewColoers = new ArrayList<>();
viewColors.add(Color.BLUE);
viewColors.add(Color.YELLOW);
viewColors.add(Color.MAGENTA);
viewColors.add(Color.RED);
viewColors.add(Color.BLACK);
viewColors.add(Color.DKGRAY);
viewColors.add(Color.GRAY);
viewColors.add(Color.GREEN);
ArrayList<String> colorNames = new ArrayList<>();
colorNames.add("Blue");
colorNames.add("Yellow");
colorNames.add("Magenta");
colorNames.add("Red");
colorNames.add("Black");
colorNames.add("DarkGray");
colorNames.add("Gray");
colorNames.add("Green");
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
CircularLinearLayoutManager horizontalLayoutManagaer
= new CircularLinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false);
horizontalLayoutManagaer.scrollToPosition(colorNames.size()/2);
recyclerView.setLayoutManager(horizontalLayoutManagaer);
adapter = new MyRecyclerViewAdapter(this, viewColors, colorNames);
adapter.setClickListener(this);
recyclerView.setAdapter(adapter);
}
@Override
public void onItemClick(View view, int position) {
Toast.makeText(this, "You clicked " + adapter.getItem(position) + " on item position " + position, Toast.LENGTH_SHORT).show();
}
}
А вот переходник для переработчика:
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder>{
private List<Integer> mViewColors = Collections.emptyList();
private List<String> mColorTexts = Collections.emptyList();
private LayoutInflater mInflater;
private ItemClickListener mClickListener;
private int position;
private static int ACTUAL_SIZE_OF_LIST = 8;
public MyRecyclerViewAdapter(Context context, List<Integer> colors, List<String> colorNames) {
this.mInflater = LayoutInflater.from(context);
this.mViewColors = colors;
this.mColorTexts = colorNames;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.recyclerview_item, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
int color = mViewColors.get(position % ACTUAL_SIZE_OF_LIST);
String text = mColorTexts.get(position % ACTUAL_SIZE_OF_LIST);
holder.myView.setBackgroundColor(color);
holder.myTextView.setText(text);
this.position = position % ACTUAL_SIZE_OF_LIST;
}
@Override
public int getItemCount() {
return mColorTexts.size();
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public View myView;
public TextView myTextView;
public ViewHolder(View itemView) {
super(itemView);
myView = itemView.findViewById(R.id.colorView);
myTextView = itemView.findViewById(R.id.colorName);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
}
}
public String getItem(int id) {
return mColorTexts.get(id);
}
public void setClickListener(ItemClickListener itemClickListener) {
this.mClickListener = itemClickListener;
}
public interface ItemClickListener {
void onItemClick(View view, int position);
}
}