我的目标:一项活动中的两个列表视图。当滚动一个列表视图时,另一个列表视图会自动滚动,延迟时间为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秒。
答案 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);