Добавить вид в начало в 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);
    }

}

0 ответов

Другие вопросы по тегам