안녕하세요.
매번 도움을 요청하고 있는 초보 개발자 입니다.
질문에서와 마찬가지로, listview를 custom으로 만들어서 adapter에 set시켜서 리스트뷰를 만들었습니다.
카카오톡에서는 터치시 색이 변하고 때면 색이 다시 돌아오는데요.
public View getView(int position, View convertView, ViewGroup garent) {
View v = convertView;
if (v == null) {
v = Inflater.inflate(layout, null);
}
final XXX e = items.get(position);
v.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
v.setBackgroundColor(Color.LTGRAY);
} else if (event.getAction() == MotionEvent.ACTION_UP) {
v.setBackgroundColor(Color.WHITE);
}
return false;
}
});
}
public void onItemClick(AdapterView adapter, View view, final int position,
long id) {
view.setBackgroundColor(Color.WHITE);
}
이런식으로 해서 해결하는 듯 했는데, 길게 터치하고 밑으로 끌어내려서 손을 떼면 색이 흰색으로 안돌아오네요.ㅜ
저같이 복잡한 방법 말고 혹시 다르게 해결 하신 분 계신가요?
매번 질문만 남겨서 죄송합니다.. 얼른 실력 키워 남들에게 도움되는 개발자가 되겠습니다!!^^
음... 더 편리한 방법은 아니지만..
다른 방법 못찾으시면 최후의 수단으로 써보세요..ㅎ
getView가 속해있는 Adapter에 touchedView라는 View를 멤버변수로 만들어 놓고 getTouchedView 라는 메소드를 정의해주시고,
convertView의 onTouch의 Action_down에서 배경을 교체하면서 매개변수로 받은 v를 touchedView에 넣어주세요.
그리고 커스터마이징하신 리스트뷰에 setOnTouchListener를 정의하시고,
Action_up에서 getAdapter(), getTouchedView로 눌렸던 뷰를 가져와서 배경 교체 해주시면 돼요.ㅎ
간단히 말하면 눌린 뷰를 따로 저장해놓았다가 리스트뷰의 onTouch에서 불러와서 컨트롤하시면 됩니다 ^-^
그리고 convertView를 그대로 쓰시면 위로 올라간 뷰에 적용되어야 할것들이 아래에서 새로 올라온 뷰에
적용되는것 같은, 말그대로 재활용 뷰라 여러모로 귀찮은점이 많더라구요.
그래서 전 개인적으로 View(또는 해당 View의 ImageView만)를 ArrayList로 관리하고
position에 따라 불러오는 방식으로 사용하고 있어요.
저도 초보 개발자라 몇달전에 리스트뷰 그리드뷰때문에 답답해했었는데..ㅎ
머리 아프시겠지만 힘내세요, 화이팅!