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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

6341閲覧

RecyclerViewが勝手にスクロールする

退会済みユーザー

退会済みユーザー

総合スコア0

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2016/11/11 20:31

編集2016/11/15 01:02

###前提・実現したいこと
RecyclerViewを用いた画面を作成しています。
スワイプで画面を切り替えると自動でスクロールしてしまいます。
なぜ勝手にスクロールしてしまうのか理由がわかりません。
そもそもこのようなレイアウトは不可能なのでしょうか。
###発生している問題・エラーメッセージ
RecyclerView - View - RecyclerViewという順で
LinearLayoutのVerticalで配置しています。
真ん中のViewが表示される位置までスクロールした状態で、
スワイプで画面を切り替え、元に戻ると、
下部のRecyclerViewの上端がレイアウトのトップの位置に
自動でスクロールしてしまいます。

エラーメッセージは特にありません。

起動直後
イメージ説明
真ん中のViewが表示される位置までスクロール
イメージ説明
スワイプで画面切り替え
イメージ説明
元のページに戻り中
イメージ説明
元のページに戻りきった直後にScrollToされたかのように位置が変わる
イメージ説明
###該当のソースコード
activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent"> 6 <android.support.design.widget.AppBarLayout 7 android:layout_width="match_parent" 8 android:layout_height="wrap_content"> 9 <android.support.v7.widget.Toolbar 10 android:id="@+id/toolbar" 11 android:layout_width="match_parent" 12 android:layout_height="?attr/actionBarSize" 13 android:background="?attr/colorPrimary" 14 app:layout_scrollFlags="scroll|enterAlways" /> 15 <android.support.design.widget.TabLayout 16 android:id="@+id/tab_layout" 17 android:layout_width="match_parent" 18 android:layout_height="wrap_content" 19 android:background="?attr/colorPrimary" 20 app:tabIndicatorColor="#FFFF8D" /> 21 </android.support.design.widget.AppBarLayout> 22 <android.support.v4.view.ViewPager 23 android:id="@+id/view_pager" 24 app:layout_behavior="@string/appbar_scrolling_view_behavior" 25 android:layout_width="match_parent" 26 android:layout_height="wrap_content"/> 27</android.support.design.widget.CoordinatorLayout>

MainActivity.java

java

1public class MainActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener { 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.activity_main); 6 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 7 setSupportActionBar(toolbar); 8 FragmentPagerAdapter adapter = new FragmentPagerAdapter(getSupportFragmentManager()) { 9 @Override 10 public Fragment getItem(int position) { 11 return BlankFragment.newInstance("", ""); 12 } 13 @Override 14 public CharSequence getPageTitle(int position) { 15 return "tab " + (position + 1); 16 } 17 @Override 18 public int getCount() { 19 return 2; 20 } 21 }; 22 ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager); 23 viewPager.setAdapter(adapter); 24 TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); 25 tabLayout.setupWithViewPager(viewPager); 26 } 27 @Override 28 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 29 } 30 @Override 31 public void onPageSelected(int position) { 32 } 33 @Override 34 public void onPageScrollStateChanged(int state) { 35 } 36}

RecyclerAdapter.java

java

1public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> { 2 private LayoutInflater mInflater; 3 private ArrayList<String> mData; 4 public RecyclerAdapter(Context context, ArrayList<String> data) { 5 mInflater = LayoutInflater.from(context); 6 mData = data; 7 } 8 @Override 9 public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 10 return new ViewHolder(mInflater.inflate(R.layout.list_item, viewGroup, false)); 11 } 12 @Override 13 public void onBindViewHolder(ViewHolder viewHolder, final int i) { 14 if (mData != null && mData.size() > i && mData.get(i) != null) { 15 viewHolder.textView.setText(mData.get(i)); 16 if (i % 2 == 0) { 17 viewHolder.textView.setBackgroundColor(Color.argb(0x44, 0xff, 0x00, 0x00)); 18 } else { 19 viewHolder.textView.setBackgroundColor(Color.argb(0x44, 0x00, 0x00, 0xff)); 20 } 21 } 22 } 23 @Override 24 public int getItemCount() { 25 if (mData != null) { 26 return mData.size(); 27 } else { 28 return 0; 29 } 30 } 31 class ViewHolder extends RecyclerView.ViewHolder { 32 TextView textView; 33 public ViewHolder(View itemView) { 34 super(itemView); 35 textView = (TextView) itemView.findViewById(R.id.list_item_text); 36 } 37 } 38}

BlankFragment.java

java

1public class BlankFragment extends Fragment { 2 private static final String ARG_PARAM1 = "param1"; 3 private static final String ARG_PARAM2 = "param2"; 4 private String mParam1; 5 private String mParam2; 6 private View mRootView; 7 public BlankFragment() { 8 } 9 public static BlankFragment newInstance(String param1, String param2) { 10 BlankFragment fragment = new BlankFragment(); 11 Bundle args = new Bundle(); 12 args.putString(ARG_PARAM1, param1); 13 args.putString(ARG_PARAM2, param2); 14 fragment.setArguments(args); 15 return fragment; 16 } 17 @Override 18 public void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 if (getArguments() != null) { 21 mParam1 = getArguments().getString(ARG_PARAM1); 22 mParam2 = getArguments().getString(ARG_PARAM2); 23 } 24 } 25 @Override 26 public View onCreateView(LayoutInflater inflater, ViewGroup container, 27 Bundle savedInstanceState) { 28 mRootView = inflater.inflate(R.layout.fragment_blank, container, false); 29 return mRootView; 30 } 31 @Override 32 public void onAttach(Context context) { 33 super.onAttach(context); 34 } 35 @Override 36 public void onDetach() { 37 super.onDetach(); 38 } 39 @Override 40 public void onActivityCreated(@Nullable Bundle savedInstanceState) { 41 super.onActivityCreated(savedInstanceState); 42 ArrayList<String> upperArray = new ArrayList<>(); 43 for (Integer i=0; i<10; i++) { 44 upperArray.add("upper " + i.toString()); 45 } 46 RecyclerAdapter upperAdapter = new RecyclerAdapter(getActivity(), upperArray); 47 RecyclerView mRecyclerView = (RecyclerView) mRootView.findViewById(R.id.upper_recycler_view); 48 mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 49 mRecyclerView.setAdapter(upperAdapter); 50 ArrayList<String> lowerArray = new ArrayList<>(); 51 for (Integer i=0; i<10; i++) { 52 lowerArray.add("lower " + i.toString()); 53 } 54 RecyclerAdapter lowerAdapter = new RecyclerAdapter(getActivity(), lowerArray); 55 RecyclerView mRecyclerView2 = (RecyclerView) mRootView.findViewById(R.id.lower_recycler_view); 56 mRecyclerView2.setLayoutManager(new LinearLayoutManager(getActivity())); 57 mRecyclerView2.setAdapter(lowerAdapter); 58 } 59}

fragment_blank.xml

xml

1<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:orientation="vertical" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" > 5 <android.support.v4.widget.NestedScrollView 6 android:layout_width="match_parent" 7 android:layout_height="match_parent"> 8 <LinearLayout 9 android:orientation="vertical" 10 android:layout_width="match_parent" 11 android:layout_height="match_parent"> 12 <android.support.v7.widget.RecyclerView 13 android:id="@+id/upper_recycler_view" 14 android:layout_width="match_parent" 15 android:layout_height="wrap_content" /> 16 <View 17 android:background="#ff00ff00" 18 android:layout_width="match_parent" 19 android:layout_height="200dp" /> 20 <android.support.v7.widget.RecyclerView 21 android:id="@+id/lower_recycler_view" 22 android:layout_width="match_parent" 23 android:layout_height="wrap_content" /> 24 </LinearLayout> 25 </android.support.v4.widget.NestedScrollView> 26</LinearLayout>

build.gradleのdependencies

gradle

1dependencies { 2 compile fileTree(dir: 'libs', include: ['*.jar']) 3 androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 4 exclude group: 'com.android.support', module: 'support-annotations' 5 }) 6 compile 'com.android.support:appcompat-v7:24.2.1' 7 compile 'com.android.support:design:24.2.1' 8 compile 'com.android.support:support-v4:24.2.1' 9 compile 'com.android.support:recyclerview-v7:24.2.1' 10 testCompile 'junit:junit:4.12' 11}

###試したこと
真ん中のViewが表示されない位置で試すと再現しない
エミュレータでも試してみましたが同様の結果でした。
###補足情報(言語/FW/ツール等のバージョンなど)
端末: xperia z1
OS: Android 4.4.2
開発環境: Android studio 2.2.2

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

スクロールしているのを見ているわけではないですね?あくまでスクロールされたように元の位置に戻っているだけでは。
Viewが作り直されている可能性があるのでBlankFragment#onCreateViewでログ出力を行い、再度呼ばれていないかを確認してください。

投稿2016/11/12 07:20

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/11/14 12:13 編集

>スクロールしているのを見ているわけではないですね?
yona

2016/11/12 11:36

不思議ですね。 NestedScrollViewとRecyclerViewを重ねてるのが関係してそうですね。 NestedScrollViewを普通のScrollViewに変更してみるとどうなりますか?
退会済みユーザー

退会済みユーザー

2016/11/14 12:13 編集

ScrollViewに変更して試してみましたが、同じようにスクロール位置が変わりました。
yona

2016/11/12 12:20

原意を切り分けたいだけなのでScrollViewを使えと言っているわけではありません。 ・一旦Viewを削除して試してください。 ・一旦RecyclerViewとViewを削除して試してください。
退会済みユーザー

退会済みユーザー

2016/11/14 12:13 編集

>原意を切り分けたいだけなのでScrollViewを使えと言っているわけではありません。 はい。
yona

2016/11/12 12:44

ということはScrollできるViewの中にRecyclerViewを2つ入れると問題が発生するのかも知れないですね。 RecyclerViewだけを消して再度確認してください。
退会済みユーザー

退会済みユーザー

2016/11/14 12:13 編集

特に何も問題はありませんでした。
退会済みユーザー

退会済みユーザー

2016/11/14 12:13 編集

上のRecyclerViewのみをけした場合は再現しました!
yona

2016/11/12 13:43

View-RecyclerViewで発生したということですね?
退会済みユーザー

退会済みユーザー

2016/11/14 12:14 編集

そうです。
退会済みユーザー

退会済みユーザー

2016/11/14 12:14 編集

最下部までスクロールした状態からだと発生しないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問