English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

AndroidのListViewのアイテムにScrollViewを内包する解決策

 フロントエンド:時々、リストビューのアイテムには表示するフィールドが多い場合があり、表示の問題を考慮して、アイテムの外に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(メール送信時は、#を@に変更してください)で通報してください。関連する証拠を提供していただければ、侵害が確認された場合、このサイトは即座に侵害された内容を削除します。

おすすめ