2011-03-24 2 views
0

새로운 빈 행을 추가하고 새 행의 컨트롤을 편집 할 수있는 Android에서 ListView를 만들고 싶습니다. 그런 다음 사용자가 다시 추가를 클릭하거나 다른 행을 선택하거나 아직 결정하지 않은 다른 이벤트에서 사용자가 편집 가능한 행에 입력 한 값으로 어댑터를 업데이트하려고합니다.편집 가능한 ListView - UI 값으로 어댑터 업데이트

현재 각 행에는 편집 가능한 컨트롤이 있으며 메뉴 항목을 통해 빈 행을 추가 할 수 있습니다. 사용자가 입력 한 데이터를 어댑터와 동기화하는 방법을 알 수 없습니다.

원래 어댑터는 양방향 데이터 바인딩이라고 생각했지만 그럴 듯하지는 않습니다. 내 연구 및 실험에서 Adapter 값을 변경하고 notifyDataSetChanged()를 호출하면 UI가 업데이트됩니다. 역 동작이 있습니까?

+0

ListView에서 값을 어떻게 편집하고 있습니까?일단 데이터 세트를 변경하고 notifyDataSetChanged()를 호출하면 ListView 항목에 데이터를 입력하기 만하면된다. – LeffelMania

답변

2

와 pos의 위치에있는 개체를 업데이트 것이다 UPDAT의 mthod이 있는지 확인 내 행 뷰의 각 컨트롤에 KeyListener 및 OnFocusChangeListener를 추가합니다. 이 두 이벤트는 뷰의 모든 컨트롤을 반복하고 어댑터의 데이터를 현재 값으로 업데이트하기 위해 내 행의 뷰에서 만든 메서드를 호출합니다. notifyDataSetChanged()를 호출하지 않도록해야했습니다. 이 메서드는 프로그래밍 방식으로 데이터 소스 개체를 변경하고 UI에 변경 내용이 반영되도록하는 경우에만 필요합니다.

가장 효율적인 방법은 아니지만 잘 작동합니다.

또 다른주의 사항, 행 추가 및 삭제 내 어댑터보기의 업데이트 제어 및보기 수준 스퀠 치를 설정해야했습니다. 삭제를 위해, 내 행의보기에 긴 클릭 이벤트를 추가하여 삭제 옵션이있는 메뉴를 만들었습니다. 그런 다음 필자는 데이터 소스 개체를 프로그래밍 방식으로 편집하여 지정된 행 데이터를 제거하고 notifyDataSetChanged()를 호출하기 때문에 View 수준에서 업데이트를 스켈링하기 시작했습니다. 그렇지 않으면 OS가 예외를 throw합니다. 스퀠 치는 여기서 내 이벤트를 치지 않고 무한 루프로 들어가고 데이터가 제대로 동기화되는지 확인합니다. 그런 다음 삭제 된 행보기에서 이벤트의 업데이트 어댑터를 스켈치하기 위해 모든 컨트롤을 설정합니다. 삭제 된 행 뷰에 여전히 포커스가 있고 UI에없는 값으로 데이터 원본 개체를 업데이트하지 않기를 원하기 때문입니다. 이 플래그는 내 어댑터의 getView()에서 ListView 재활용 프로세스의 행 뷰를 얻으면 뒤집 힙니다.

새 행을 추가 할 때도 행의보기 수준에서 스퀠 핑해야합니다. 이는 프로그래밍 방식으로 데이터 소스를 새 비어있는 데이터 행으로 변경하고 notifyDataSetChanged를 호출하기 때문입니다. 이유는 삭제와 정확히 같습니다.

0

당신의 문제는 당신입니다. 예를 들어 목록에있는 300 개의 항목 (EditItems에 의해 반려 됨)이 실제로 재활용되는 12-20 개의 EditItem 만 있습니다. 각 행에서 FocsedChangedListener라는 것이 그의 행으로 끝났음을 알 수있는 유일한 방법이라고 생각합니다.

  1. 어댑터의의 getView의 사용 : 초점 일단 사용 꺼져 V가보기 인 경우 다음을 수행 v.setTag (위치) OnFocusChangedListener에서
  2. 초점이 해제되면 사용 : INT의 POS = (정수) v.getTag(); mAdapter.updatePosition (텍스트, POS)
  3. 이 어댑터는 문자열 '텍스트'내가 바인딩 양방향 데이터를 달성 할 수 있었다
+0

onFocusChangedListener에서 볼 수있는 문제점 : 1) 트랙볼을 사용하여 행 1의 편집 가능한 컨트롤 하나에서 행 2의 다음 편집 가능한 컨트롤로 이동하는 경우에만 발생합니다. 2) 목록 외부의 버튼을 클릭해도이 컨트롤이 실행되지 않습니다 행사. 3) 목록을 스크롤해도이 이벤트가 발생하지 않습니다. –

0

C Nick의 솔루션을 좀 더 구체화하려면 EditText.addTextChangedListener를 사용할 수 있습니다.