태그:                             

원문 링크 : [펌] 안드로이드 ViewFlipper 안에 ListView 사용하기


차계부 프로그램을 만들면서 한참 해결이 안되던 문제인 ViewFlipper 안에 있는 ListView에서의 좌우 밀기 동작에 대한 답을 찾았다. 좌우 밀기 동작이 약간 불만이긴 한데 우선 적용하고 나중에 더 좋은 방법을 찾아서 적용해야 겠다.

아…이걸로 하려고 했는데 너무 이상하다. 리스트뷰 부분만 좌우 swipe에 반응해야 되는데, 화면 전체가 반응을 하고, 플리핑은 리스트뷰 부분만 된다. 원래 만들었던 탭으로 복귀하고, 이건 나중에 다시 연구해보자.

public class PracticeActivity extends ListActivity {
	private static final String[] m_Starbucks = {
		"Latte", "Cappuccino", "Caramel Macchiato", "Americano", "Mocha",
		"White Mocha", "Mocha Valencia", "Cinnamon Spice Mocha", "Toffee Nut Latte",
		"Espresso", "Espresso Macchiato", "Espresso Con Panna"
	};

	private int REL_SWIPE_MIN_DISTANCE;
	private int REL_SWIPE_MAX_OFF_PATH;
	private int REL_SWIPE_THRESHOLD_VELOCITY;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// As paiego pointed out, it's better to use density-aware measurements.
		DisplayMetrics dm = getResources().getDisplayMetrics();
		REL_SWIPE_MIN_DISTANCE = (int)(120.0f * dm.densityDpi / 160.0f + 0.5);
		REL_SWIPE_MAX_OFF_PATH = (int)(250.0f * dm.densityDpi / 160.0f + 0.5);
		REL_SWIPE_THRESHOLD_VELOCITY = (int)(200.0f * dm.densityDpi / 160.0f + 0.5);

		ListView lv = getListView();
		lv.setAdapter(new ArrayAdapter<String>(this,
			android.R.layout.simple_list_item_1, m_Starbucks));

		final GestureDetector gestureDetector = new GestureDetector(new
			MyGestureDetector());
		View.OnTouchListener gestureListener = new View.OnTouchListener() {
			public boolean onTouch(View v, MotionEvent event) {
				return gestureDetector.onTouchEvent(event);
			}};
		lv.setOnTouchListener(gestureListener);

		// Long-click still works in the usual way.
		lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
			public boolean onItemLongClick(AdapterView<?> parent,
				View view, int position, long id) {
				String str = MessageFormat.format("Item long clicked = {0,number}",
					position);
				Toast.makeText(PracticeActivity.this, str, Toast.LENGTH_SHORT).show();
				return true;
			}
		});
	}

	// Do not use LitView.setOnItemClickListener(). Instead, I override
	// SimpleOnGestureListener.onSingleTapUp() method, and it will call
	// to this method when it detects a tap-up event.
	private void myOnItemClick(int position) {
		String str = MessageFormat.format("Item clicked = {0,number}", position);
		Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
	}

	private void onLTRFling() {
		Toast.makeText(this, "Left-to-right fling", Toast.LENGTH_SHORT).show();
	}

	private void onRTLFling() {
		Toast.makeText(this, "Right-to-left fling", Toast.LENGTH_SHORT).show();
	}

	class MyGestureDetector extends SimpleOnGestureListener{

		// Detect a single-click and call my own handler.
		@Override
		public boolean onSingleTapUp(MotionEvent e) {
			ListView lv = getListView();
			int pos = lv.pointToPosition((int)e.getX(), (int)e.getY());
			myOnItemClick(pos);
			return false;
		}

		@Override
		public boolean onFling(MotionEvent e1, MotionEvent e2,
			float velocityX, float velocityY) {
			if (Math.abs(e1.getY() - e2.getY()) > REL_SWIPE_MAX_OFF_PATH)
				return false;
			if(e1.getX() - e2.getX() > REL_SWIPE_MIN_DISTANCE &&
				Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) {
				onRTLFling();
			}  else if (e2.getX() - e1.getX() > REL_SWIPE_MIN_DISTANCE &&
				Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) {
				onLTRFling();
			}
			return false;
		}
	}
}

관련글

[펌] 안드로이드 ViewFlipper 안에 ListView 사용하기

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다