English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
フロントエンド:時々、リストビューのアイテムには表示するフィールドが多い場合があり、表示の問題を考慮して、アイテムの外にScrollViewをネストして実現する必要があります。その結果、リストビューがクリックイベントを実行する際に、ScrollViewのネスト使用によりリストビューのクリックイベントがキャッチされ、リストビューを再定義して実現するしかありません。
/** * * @author 著者:易皇星 * * @da2016年10月24日 * * @toTODO クラスの説明:ListViewにネストされたScrollView、ScrollViewがListViewのアイテムクリックイベントをインターセプトする解決策 * * * listviewにScrollViewをネストすると、横スライドと縦スライドが正常に動作しますが、listviewのアイテムをクリックすることができません。Androidの配信メカニズムを調査後、解決しました。Listviewを継承してListviewのonInterceptTouchEventをオーバーライドしました。 * * onInterceptTouchEventでは常にlistviewのonTouchEventを呼び出し、listviewのイベントがすべて実行されることを保証します。 * super.onInterceptTouchEvent(ev)は、ScrollViewに横スライドを伝える必要がある場合にインターセプトしません。 */ public class MyListView extends ListView { private int flag = 0; private float StartX; private float StartY; public MyListView(Context context) { super(context); // TODO Auto-生成されたコンストラクタスタブ } public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-生成されたコンストラクタスタブ } public MyListView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-生成されたコンストラクタスタブ } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { // 常にlistviewのtouchイベントを処理する onTouchEvent(ev); if (ev.getAction() == MotionEvent.ACTION_DOWN) { StartX = ev.getX(); StartY = ev.getY(); return false; } if (ev.getAction() == MotionEvent.ACTION_MOVE) { float ScollX = ev.getX() - StartX; float ScollY = ev.getY() - StartY; // 横スライドか縦スライドかを判断します。縦スライドの場合、moveイベントとupイベントをキャンセルします(キャンセルしないとlistviewとscrollviewが同時にスライドするとスライドが重複し、カクつきます) if (Math.abs(ScollX) < Math.abs(ScollY)) { flag = 1; return true; } return false; } if (ev.getAction() == MotionEvent.ACTION_UP) { if (flag == 1) { return true; } return false; } return super.onInterceptTouchEvent(ev); } }
以上は、編集者が皆さんに紹介したAndroid ListViewのitemにScrollViewを埋め込む解決策です。皆さんに役立つことを願っています。何か疑問があれば、コメントを残してください。編集者は皆さんの質問に迅速に回答します。このサイトへのサポートに感謝しています!
声明:この記事の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしました。このウェブサイトは所有権を持ちません。人工的な編集は行われていません。また、関連する法的責任を負いません。著作権侵害が疑われる場合は、メールでお知らせください:notice#oldtoolbag.com(メール送信時は、#を@に変更してください)で通報してください。関連する証拠を提供していただければ、侵害が確認された場合、このサイトは即座に侵害された内容を削除します。