前提・実現したいこと
recyclerviewで作成されたスクロールを指ではなく、ボタンの押下で1スライドずつ動かしたいです。
例えば、No.1 No.2 No.3 No.4…とスクロールになっていて、No.1が画面の中心にある場合、
右ボタンを押すとNo.2が画面中心にスライドされるというような感じです。
※画面の向きはlandscapeで作成しています。
現状作成しているスクロールは以下のURLの「端の要素を中心にする」バージョンです。
これは必ず必要です。
(cardviewではなく、imagebuttonで作成していますが…)
https://ryuta46.com/1207
該当のソースコード
MainActivity.java
Java
public class MainActivity extends AppCompatActivity { ScrollController controller; private static final Integer[] icons = { R.drawable.A, R.drawable.B, R.drawable.C, R.drawable.D, R.drawable.E, R.drawable.F, R.drawable.G }; private static final String[] iconNames = { "No.1", "No.2", "No.3", "No.4", "No.5", "No.6", "No.7" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.setHasFixedSize(true); RecyclerView.LayoutManager rLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); recyclerView.setLayoutManager(rLayoutManager); List<Integer> itemImages = new ArrayList<>(Arrays.asList(icons)); List<String> itemNames = new ArrayList<>(Arrays.asList(iconNames)); RecyclerAdapter recyclerAdapter = new RecyclerAdapter(itemImages, itemNames); recyclerView.setAdapter(recyclerAdapter); controller = new ScrollController(); recyclerView.addOnItemTouchListener(controller); //中央にスナップ LinearSnapHelper snapHelper = new LinearSnapHelper(); snapHelper.attachToRecyclerView(recyclerView); //アイテムが最初または最後であっても、強制的に中央に配置 recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() { @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int edgeMargin = (parent.getWidth() - view.getLayoutParams().width) / 2; int position = parent.getChildAdapterPosition(view); if (position == 0) { outRect.left = edgeMargin; } if (position == state.getItemCount() - 1) { outRect.right = edgeMargin + 11; } } }); ImageButton left_button = findViewById(R.id.left_button); ImageButton right_button = findViewById(R.id.right_button); left_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //ここに何を書いていいのかわからない } } }); right_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //ここに何を書いていいのかわからない } }); } }
RecyclerAdapter.java
Java
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> { // final Context context; // private int itemCount; private final List<Integer> iImages; private final List<String> iNames; private View.OnClickListener m_listener; int m_line; static class ViewHolder extends RecyclerView.ViewHolder { ImageButton imagebutton; TextView textview; ViewHolder(View v) { super(v); imagebutton = v.findViewById(R.id.imageButton); textview = v.findViewById(R.id.textView14); } } RecyclerAdapter(List<Integer> itemImages, List<String> itemNames) { this.iImages = itemImages; this.iNames = itemNames; } public void setOnItemClickListener(View.OnClickListener listener){ m_listener = listener; } @Override @NonNull public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_row, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.imagebutton.setImageResource(iImages.get(position)); holder.textview.setText(iNames.get(position)); final int pos = position; // リスト上のボタンが押された時に上で登録したクリックリスナーを呼び出してあげる holder.imagebutton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { m_line = pos; m_listener.onClick(view); } }); } public int getLine(){ return m_line; //行数を取得 } @Override public int getItemCount() { return iImages.size(); } }
land\recycler_row.xml
xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="450dp" android:layout_height="match_parent" android:padding="15dp"> <ImageButton android:id="@+id/imageButton" android:layout_width="350dp" android:layout_height="350dp" android:layout_marginStart="1dp" android:layout_marginTop="160dp" android:layout_marginEnd="1dp" android:layout_marginBottom="26dp" android:background="#00000000" android:scaleType="fitXY" app:layout_constraintBottom_toTopOf="@+id/textView14" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:srcCompat="@drawable/A" /> <TextView android:id="@+id/textView14" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="259dp" android:gravity="center_horizontal" android:text="No.1" android:textSize="60dp" android:textColor="#FFFFFF" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/imageButton" /> </androidx.constraintlayout.widget.ConstraintLayout>
land\activity_main.xml
xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="0dp" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:listitem="@layout/recycler_row" /> <ImageButton android:id="@+id/left_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="67dp" android:layout_marginBottom="63dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" android:background="@null" app:srcCompat="@drawable/arrow_left" /> <ImageButton android:id="@+id/right_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="67dp" android:layout_marginBottom="63dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" android:background="@null" app:srcCompat="@drawable/arrow_right" /> </androidx.constraintlayout.widget.ConstraintLayout>
試したこと
recyclerView.smoothScrollToPositionを使用し、「positionが2のとき、recyclerView.smoothScrollToPosition(3)」も試してみましたが、
要素の端を中心にしたことで、recyclerView.smoothScrollToPosition(6)へ移動するときにNo.6を飛ばしてNo.7へ移動してしまいました…
補足情報(FW/ツールのバージョンなど)
Android studioを使用し、javaで作成しています。
どうにか実現したい事ができないかインターネットで調べてみましたが、
全然実現方法がわかりませんでした…
お手数をおかけしますが、プログラミングも初心者のため丁寧に説明もいただけるとありがたいです。
よろしくお願いします。
まだ回答がついていません
会員登録して回答してみよう