ScrollView内に複数のHorizontalScrollViewがあります。水平スクロールはまったくスムーズではありません。スクロールを機能させるには、ほぼ完全に水平方向にスクロールする必要があります。これを微調整する簡単な修正はありますか?ありがとう!
6 に答える
スタッガードレイアウトマネージャーでリサイクラービューを使用できます
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.HORIZONTAL);
RecyclerViewAdapter recyclerViewAdapter = newRecyclerViewAdapter(this);
recyclerView.setAdapter(recyclerViewAdapter); //Don't miss to initialize your adapter
このクラスは、HorizontalScrollViewを1つのクラスに結合したScrollViewを作成します。AddChild()メソッドを使用してその中にものを入れることができます。dispatchTouchEvent overideはスクロールをスムーズに保つので、指を1回スライドさせるだけでパンできます。
(最近、これを使用して、プログラムで作成されたTextViewをラップしました)
class MultiScrollView extends ScrollView
{
public HorizontalScrollView hscroll;
public MultiScrollView ( Context context )
{
super( context );
}
public void AddChild( View child )
{
hscroll.addView( child );
}
@Override
public boolean dispatchTouchEvent( MotionEvent event )
{
hscroll.dispatchTouchEvent(event);
onTouchEvent(event);
return true;
}
}
( http://www.dev-smart.com/archives/34 )の水平スクロールビューソリューションを使用している場合、スクロールビューとリストビューの間のクロスフォーカスの問題のソリューションは、スクロールビューへのフォーカスをブロックしています。リストビューにフォーカスしたら。
技術的な観点から、onScroll
HorizontalListViewクラス内の関数に次の行を追加する必要があります。
getParent().requestDisallowInterceptTouchEvent(true);
お役に立てれば。
私は解決策を見つけましたが、これがこれを正常に機能させるためにあなたがしなければならないことであるとはまだ信じられません!空白のonClickListenerをHorizo ntalScrollViewの各アイテムに追加しました。
item.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
このスライドの後は、上向きと下向きの両方で非常にスムーズです。
一般に、AndroidでネストされたScrollViewを使用するべきではありません。このようにスクロールする動作も、不自然です。
レイアウトデザインを再考することをお勧めしますが、拡張可能なリストでは実現できなかったものはありますか?
デビッドの答えは機能しますが、欠点があります。ScrollViewのMotionEventオブジェクトをHorizontalScrollView.onTouchEvent()に直接渡すため、HorizontalScrollViewまたはその子がイベント座標を取得しようとすると、ScrollViewに基づく間違った座標が取得されます。
私の解決策:
public class CustomScrollView extends ScrollView{
/*************skip initialization*************/
@Override
public boolean onInterceptTouchEvent(MotionEvent e){
//returning false means ScrollView is not interested at any events,
//so ScrollView's onTouchEvent() won't be called,
//and all of the events will be passed to ScrollView's child
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//manually call ScrollView's onTouchEvent(),
//the vertical scrolling happens there.
onTouchEvent(ev);
//dispatch the event,
//ScrollView's child will have every event.
return super.dispatchTouchEvent(ev);
}
}
このCustomScrollViewをレイアウトファイルのHorizontalScrollViewにラップするだけです。