现在的位置: 首页 > 综合 > 正文

ListView与手势识别不能正确响应的解决办法

2013年02月04日 ⁄ 综合 ⁄ 共 5557字 ⁄ 字号 评论关闭

本来想通过手指的左右滑动实现Activity之间的跳转,这个通过手势识别就可以轻松的实现,但是我发现加上listview后,界面的识别就比较混乱了,找了半天

终于找到了解决办法,什么也不说,上代码。

首先整体代码。

public class MainActivity extends Activity implements OnTouchListener,OnGestureListener {
	private List<Map<String, Object>> mData;
	ListView listView;
	LinearLayout layout;
	 private GestureDetector mGestureDetector;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
	
		listView=(ListView) this.findViewById(R.id.listview);
		layout=(LinearLayout) this.findViewById(R.id.linearlayout);
		mGestureDetector=new GestureDetector(this);
		mData=getData();
		MyAdapter adapter=new MyAdapter(this);
		listView.setAdapter(adapter);
		layout.setOnTouchListener(this);   
		layout.setFocusable(true);   
		layout.setClickable(true);   
		layout.setLongClickable(true);   
		mGestureDetector.setIsLongpressEnabled(true);
		
	}
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		// TODO Auto-generated method stub
		mGestureDetector.onTouchEvent(ev);
		return super.dispatchTouchEvent(ev);
	}
	private List<Map<String, Object>> getData() {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

		Map<String, Object> map = new HashMap<String, Object>();
		map.put("title", "G1");
		map.put("img", R.drawable.bomb10);
		list.add(map);

		map = new HashMap<String, Object>();
		map.put("title", "G2");
		map.put("img", R.drawable.bomb11);
		list.add(map);

		map = new HashMap<String, Object>();
		map.put("title", "G3");
		map.put("img", R.drawable.bomb12);
		list.add(map);
		map = new HashMap<String, Object>();
		map.put("title", "G4");
		map.put("img", R.drawable.bomb13);
		list.add(map);
		map = new HashMap<String, Object>();
		map.put("title", "G5");
		map.put("img", R.drawable.bomb14);
		list.add(map);
		map = new HashMap<String, Object>();
		map.put("title", "G6");
		map.put("img", R.drawable.bomb15);
		list.add(map);
		map = new HashMap<String, Object>();
		map.put("title", "G7");
		map.put("img", R.drawable.bomb16);
		list.add(map);
		
		map = new HashMap<String, Object>();
		map.put("title", "G8");
		map.put("img", R.drawable.bomb5);
		list.add(map);
		map = new HashMap<String, Object>();
		map.put("title", "G9");
		map.put("img", R.drawable.bomb6);
		list.add(map);
		map = new HashMap<String, Object>();
		map.put("title", "G10");
		map.put("img", R.drawable.bomb7);
		list.add(map);
		
		map = new HashMap<String, Object>();
		map.put("title", "G11");
		map.put("img", R.drawable.bomb8);
		list.add(map);
		map = new HashMap<String, Object>();
		map.put("title", "G12");
		map.put("img", R.drawable.bomb9);
		list.add(map);
		
		map = new HashMap<String, Object>();
		map.put("title", "G13");
		map.put("img", R.drawable.bomb10);
		list.add(map);
		
		map = new HashMap<String, Object>();
		map.put("title", "G14");
		map.put("img", R.drawable.bomb11);
		list.add(map);
		map = new HashMap<String, Object>();
		map.put("title", "G15");
		map.put("img", R.drawable.bomb12);
		list.add(map);
		
		map = new HashMap<String, Object>();
		map.put("title", "G16");
		map.put("img", R.drawable.bomb13);
		list.add(map);
		
		map = new HashMap<String, Object>();
		map.put("title", "G17");
		map.put("img", R.drawable.bomb14);
		list.add(map);
		map = new HashMap<String, Object>();
		map.put("title", "G18");
		map.put("img", R.drawable.bomb15);
		list.add(map);
		
		return list;
	}
    //	=================================================================================
   //listview的adapter
	public final class ViewHolder{
		public ImageView img;
		public TextView title;
	
	}
	
	
	public class MyAdapter extends BaseAdapter{

		private LayoutInflater mInflater;
		
		
		public MyAdapter(Context context){
			this.mInflater = LayoutInflater.from(context);
		}
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return mData.size();
		}

		@Override
		public Object getItem(int arg0) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public long getItemId(int arg0) {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			
			ViewHolder holder = null;
			if (convertView == null) {
				
				holder=new ViewHolder();  
				
				convertView = mInflater.inflate(R.layout.item, null);
				holder.img = (ImageView)convertView.findViewById(R.id.img);
				holder.title = (TextView)convertView.findViewById(R.id.title);
				convertView.setTag(holder);
				
			}else {
				
				holder = (ViewHolder)convertView.getTag();
			}
			
			
			holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
			holder.title.setText((String)mData.get(position).get("title"));	
			return convertView;
		}
		
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
//============================================================================================
	//手势识别部分
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		return mGestureDetector.onTouchEvent(event);
	}
     
	
	@Override
	public boolean onDown(MotionEvent e) {
	
		return true;
	}
    

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		final int FLING_MIN_DISTANCE = 150, FLING_MIN_VELOCITY = 220;   
		//实现了左右滑动时activity之间的跳转
	    if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {   
	        Toast.makeText(this, "Left", Toast.LENGTH_SHORT).show();   
			Intent intent=new Intent();
	        intent.setClass(MainActivity.this, NextActivity.class);
	        startActivity(intent);
	    } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY) {   
	        Toast.makeText(this, "Right", Toast.LENGTH_SHORT).show(); 
            Intent intent=new Intent();
	        intent.setClass(MainActivity.this, NextActivity.class);
	        startActivity(intent);			
	    }   
	    return false;
	}

	@Override
	public void onLongPress(MotionEvent e) {
	
	}
   
	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
	
		return true;
	}
    
	@Override
	public void onShowPress(MotionEvent e) {
	
	}
 
	@Override
	public boolean onSingleTapUp(MotionEvent e) {

	
		return true;
	}

}

看完代码的同学会发现多了一个dispatchTouchEvent函数,就是这个函数完美的解决了listview和手势识别滑动之间响应冲突的问题。

具体原因可能是dispatchTouchEvent对Touch响应时间进行了分发

抱歉!评论已关闭.