处理程序中的onTouchEvent和onInterceptTouchEvent

时间:2014-01-20 10:32:52

标签: android listview

我的目标:一项活动中的两个列表视图。当滚动一个列表视图时,另一个列表视图会自动滚动,延迟时间为0.15秒。

我的想法是捕获滚动的MotionEvent并将其发送到其他列表视图。


public class MainActivity extends Activity implements OnTouchListener{
    ArrayList<ListView> mListViews = new ArrayList<ListView>();
        View sourceView;
    final Handler handler = new Handler();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListViews.add((ListView) findViewById(R.id.lva));
        mListViews.add((ListView) findViewById(R.id.lvb));
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
        for (int i = 0; i < 32; i++) {
            adapter.add("#" + i);
        }
        mListViews.get(0).setAdapter(adapter);
        mListViews.get(1).setAdapter(adapter);
        mListViews.get(0).setOnTouchListener(this);
        mListViews.get(1).setOnTouchListener(this);
    }
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        sourceView = v;
        final MotionEvent ev = event;
//      handler.postDelayed(new Runnable() {
//          
//          @Override
//          public void run() {
                for(ListView lv : mListViews){
                    if(!lv.equals(sourceView))
                        lv.onTouchEvent(ev);
                }
//          }
//      }, 150);
        return false;
    }

}

结果:

如果我评论handler.postDelayed部分,两个listview可以同步滚动(没有延迟)。 但是如果我取消注释handler.postDelayed部分,则其他listview没有响应。

  

我希望看到其他列表视图延迟0.15秒。

1 个答案:

答案 0 :(得分:0)

试试这个:

LinearLayout ll = new LinearLayout(this);
LayoutParams params = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
for (int i = 0; i < 32; i++) {
    adapter.add("#" + i);
}
final ListView lv0 = new ListView(this);
lv0.setAdapter(adapter);
ll.addView(lv0, params);
final ListView lv1 = new ListView(this);
lv1.setAdapter(adapter);
ll.addView(lv1, params);
setContentView(ll);

final Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        MotionEvent event = (MotionEvent) msg.obj;
        lv0.onTouchEvent(event);
        event.recycle();
    }
};
OnTouchListener l = new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Message msg = handler.obtainMessage(0, MotionEvent.obtain(event));
        handler.sendMessageDelayed(msg, 1500);
        return false;
    }
};
lv1.setOnTouchListener(l);