2016-06-24 11 views
0

スクロールビュー内に2つのリストビューが必要です。私はlistviewsの代わりにreyclerviewsを使用しています。あなたが想像しているように、スクロールの経験は非常に遅いです。私は、両方の私のrecyclerviewsのNestedScrollingEnabled(false)を設定することによって、ラグの問題を解決することができました。2つのリストビューをスクロールビュー内でスムーズにスクロール

rv1.setNestedScrollingEnabled(false); 
rv2.setNestedScrollingEnabled(false); 

NestedScrollingは、API 21+の機能です。これまでのAPIバージョンと同等のコードは何ですか?

私は以下を試しましたが、リスト項目はクリックできません。しかしスクロールは非常にスムーズです。

rv1.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     return true; 
    } 
}); 

rv2.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     return true; 
    } 
}); 

私は私の項目がクリック可能になるようにコードを微調整しようとしたので、私は次のようにコードを更新は、しかし、今、スムーズなスクロールがなくなっていますが、私の項目がクリック可能です。

rv1.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     int action = event.getAction(); 
     switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      // disallow scrollview to intercept touch events 
      v.getParent().requestDisallowInterceptTouchEvent(false); 
      break; 
     case MotionEvent.ACTION_UP: 
      // allow scrollview to intercept touch events 
      v.getParent().requestDisallowInterceptTouchEvent(true); 
      break; 

     v.onTouchEvent(event); 
     return true; 
    } 
}); 


rv2.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     int action = event.getAction(); 
     switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      // disallow scrollview to intercept touch events 
      v.getParent().requestDisallowInterceptTouchEvent(false); 
      break; 
     case MotionEvent.ACTION_UP: 
      // allow scrollview to intercept touch events 
      v.getParent().requestDisallowInterceptTouchEvent(true); 
      break; 

     v.onTouchEvent(event); 
     return true; 
    } 
}); 

私はそれが私のXMLが構成されている方法かもしれないと思い、これはちょうど私の理論ですが、親は、実際のLinearLayoutラッパーではなくscrollViewです。私は以下のXMLがどのように構造化されているのかを投稿しました。

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

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 

      <android.support.v7.widget.CardView 
      .... 
      .... 

      <android.support.v7.widget.RecyclerView 
       android:id="@+id/rv1" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:divider="@null" 
       android:overScrollMode="never" 
       android:scrollingCache="false"/> 

      </android.support.v7.widget.CardView> 
    </LinearLayout> 
    </ScrollView> 

これですべてのヘルプは、事前に感謝をいただければ幸いです!

答えて

0

問題を解決できました。スクロールビュー内のリストビューが非常に遅く、遅い理由は主に、それぞれのビュー内で複数のスクロールが有効になっているためです。リストビューまたはスクロールビューのスクロールをなくすことができれば、すべてがスムーズになります(スムーズに混同しないでください。最適化されていません)。ここに私がしたことがあります。

API 21にネストされたスクロールアトリビュートを使用した条件を追加し、else条件でスクロールを明示的にCustomRecyclerViewクラスで無効にするように設定しました。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     // disable nested scrolling 
     rvAirportNearest.setNestedScrollingEnabled(false); 
     rvAirportServiced.setNestedScrollingEnabled(false); 
    } else { 
     // disable scrolling 
     rvAirportNearest.setScrollingEnabled(false); 
     rvAirportServiced.setScrollingEnabled(false); 
    } 

はここでうまくいけば、これは同じ問題に直面して他の人を助ける私のカスタムリサイクルビュークラス

public class CustomScrollableRecyclerView extends RecyclerView { 

    private boolean isScrollable = true; // by default recycler view is scrollable 

    /** 
    * Constructor 
    * @param context 
    */ 
    public CustomScrollableRecyclerView(Context context) { 
     super(context); 
    } 

    /** 
    * Constructor 
    * @param context 
    * @param attrs 
    */ 
    public CustomScrollableRecyclerView(Context context, @Nullable AttributeSet attrs) { 
     super(context, attrs); 
    } 

    /** 
    * Constructor 
    * @param context 
    * @param attrs 
    * @param defStyle 
    */ 
    public CustomScrollableRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public int computeVerticalScrollRange() { 
     if (isScrollable()) { 
      return super.computeVerticalScrollRange(); 
     } 
     return 0; 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent e) { 
     if(isScrollable()) { 
      return super.onInterceptTouchEvent(e); 
     } 
     return false; 
    } 

    /** 
    * Method is used to set scrolling enabled 
    * @param enabled 
    */ 
    public void setScrollingEnabled(boolean enabled) { 
     isScrollable = enabled; 
    } 

    /** 
    * Method is used to check if scrolling is enabled 
    * @return true if scrolling is possible, otherwise false 
    */ 
    public boolean isScrollable() { 
     return isScrollable; 
    } 

} 

です。

関連する問題