2015-11-24 18 views
5

RecyclerViewScrollViewの内部に実装しています。ページ全体に1つのスクロール動作しか持たないためには、NonScrollRecyclerViewバージョンを実装します。次のように実装は次のとおりです。Android SDKのスクロールしないRecyclerViewのスクロールの問題23

public class NonScrollRecyclerView extends RecyclerView { 
    public NonScrollRecyclerView(Context context) { super(context); } 

    public NonScrollRecyclerView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public NonScrollRecyclerView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev){ 

     if(ev.getAction() == MotionEvent.ACTION_MOVE) 
      return true; 

     return super.dispatchTouchEvent(ev); 
    } 
} 

私はSDK 23に私のビルドとターゲット設定を更新したら、私はトラブルNonScrollRecyclerViewを含むページをスクロールしています。具体的な問題は、リサイクラのビュー部分に達するまでページがOKにスクロールし、一度このビューにスクロールすると、スクロールできなくなったことです。

私はSDK 22でこの問題に直面しDONOTし、次のように

の下に私のXMLは次のとおりです。

XML@layout/rvはリサイクルビューが含まれている

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/background_gray"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/background_gray" 
    android:orientation="vertical"> 

    <include 
     layout="@layout/row_mall_header" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/cv_mall_header" 
     android:layout_marginTop="8dp"/> 

    <include 
     layout="@layout/row_mall_shops" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/cv_mall_shops" 
     android:layout_marginTop="8dp"/> 

    <include 
     layout="@layout/row_mall_coupons" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/cv_mall_coupons" 
     android:layout_marginTop="8dp"/> 

    <include 
     layout="@layout/rv" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/cv_mall_feeds" 
     android:layout_marginTop="8dp"/> 

    </LinearLayout> 
</ScrollView> 

XML - レイアウト/ RV @

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/background_gray" 
    android:id="@+id/ll_mall_feeds"> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/white" 
    android:paddingTop="6dp" 
    android:paddingBottom="6dp"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/tv_feedcount" 
     android:textColor="@color/semi_theme_blue" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_marginLeft="12dp" 
     android:layout_centerVertical="true" /> 

</RelativeLayout> 

<com.project.ui.NonScrollRecyclerView 
    android:id="@+id/nrv" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:divider="@android:color/transparent" 
    android:listSelector="@android:color/transparent" /> 

</LinearLayout> 
+2

RecyclerViewの代わりにLinearLayoutを使用するのはなぜですか?あなたは本質的に、RecyclerViewをLinearLayoutに変えてしまいますが、オーバーヘッドはかなり増えます。 –

+0

上記のコメントに同意して、単にrecyclerViewを削除してください。これを考慮すると、http:// stackoverflowのXMLレイアウトの問題については尋ねません。com/questions/29956014/why-should-we-use-xml-layouts – Nanoc

+0

要件に応じてyout独自の線形レイアウトマネージャを作成できます。このリンクをチェックしてくださいhttps://github.com/serso/android-linear- layout-manager/blob/master/lib/src/main/java/org/solovyev /アンドロイド/ビュー/llm/LinearLayoutManager.java –

答えて

2

RecyclerViewとListViewは、ScrollViewのレンダリング時に要素の高さが計算されないため、ScrollView内ではお勧めできません。つまり、ScrollViewが表示されているときにアダプターが生成されず、後でRecyclerViewにデータの変更が通知されたとき(たとえば、アダプターを初期化するとき)、要素の高さを再計算する方法はありません。

要素の高さを計算する必要があり、正確ではないため、ScrollView内でListViewまたはRecyclerViewを表示するときに矛盾が生じます。要素の高さを計算する方法のいくつかの例は、hereおよびhereで確認できます。

私のアドバイスはのLinearLayoutにあなたのRecyclerViewをオンにし、リストビューまたはRecyclerViewの動作をエミュレートして、プログラム的要素を追加することです:

LinearLayout layout = (LinearLayout) rootView.findViewById(R.id.files); 
layout.removeAllViews(); 

for (int i = 0; i < fileAdapter.getCount(); i++) { 
    final View item = fileAdapter.getView(i, null, null); 
item.setClickable(true); 

    item.setId(i); 

    item.setOnClickListener(new View.OnClickListener() { 
     @Override 
      public void onClick(View v) { 

       fileContentRowPosition = v.getId(); 

     # Your click action here 


    } 
}); 


layout.addView(item); 

} 

ここでファイルの定義とそのXML:

<ScrollView 
    android:id="@+id/scrollView1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

... 

    <LinearLayout 
     android:id="@+id/files" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="5dp" 
     android:orientation="vertical"> 
    </LinearLayout> 


</ScrollView> 

Javaコード全体がhereで、レイアウト全体がhereであることを確認できます。

あなたはまだ実装していきたい、とあなたの問題に関して一方、あなたがこの記事をチェックすることができますについてHandling Scrollable Controls in Scrollview

敬具、ページ全体のスクロールだけのために

1

の代わりにNestedScrollViewを使用してScrollViewを使用し、recyclerView.setNestedScrollingEnabled(false)を設定できます。

関連する問題