質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

解決済

ボタン押下時にrecyclerviewで作成されたスクロールを1つずつスライドさせる方法

roatt
roatt

総合スコア45

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

1回答

0評価

0クリップ

422閲覧

投稿2021/11/04 07:49

前提・実現したいこと

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で作成しています。
どうにか実現したい事ができないかインターネットで調べてみましたが、
全然実現方法がわかりませんでした…
お手数をおかけしますが、プログラミングも初心者のため丁寧に説明もいただけるとありがたいです。
よろしくお願いします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。