2011-11-16 5 views
1

사용자 정의 ArrayAdapter로 작업하는 ListActivity에 이상한 문제가 있습니다. 목록 항목은 사용자 정의 된 getView를 통해 데이터에 바인드되며 텍스트 뷰와 버튼이 거의 포함되지 않습니다. 항목 버튼을 클릭하면 데이터 항목 ID가 포함 된 버튼이 눌린 태그에 따라 새 활동이 열립니다.ListActivity에서 사용자 정의 어댑터 버튼을 클릭 할 때 발생하는 문제

실제로는 특정 항목의 버튼을 클릭하면 실제로 다른 항목의 클릭을 클릭하거나 그렇게 보입니다. 정말 이상합니다. 마치 클릭 한 버튼이 다른 버튼에 포커스를 잃어 버린 것처럼 작동합니다. 대신 클릭 한 것입니다. 표준 버튼을 사용할 때 실제로 점프하는 목록 버튼에 중점을두고 어떤 종류의 혼란이 있음을 알 수 있습니다.

시나리오를 이해하지 못했지만 백그라운드에서 getView를 여러 번 호출 한 것과 관련이 있다고 생각합니다.

내 어댑터의 getView 구현의 그 :

내 목록 정의가 레이아웃의
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View v = convertView; 
    Context context = App.getContext(); 
    if (v == null) 
    { 
     // if the view is empty, init 
     v = mInflater.inflate(R.layout.list_item, null); 

     // add click listener to the item button 
     Button b = (Button)v.findViewById(R.id.b); 
     OnClickListener lsn = new OnClickListener() 
     { 
      @Override 
      public void onClick(View view) 
      { 
       // when clicked we want to open the new activity with the selected id 
       int id = Integer.parseInt(view.getTag().toString()); 
       Intent i = new Intent(mActivityContext, otherActivity.class); 
       i.putExtra("ID", id); 

       mActivityContext.startActivity(i); 
      } 
     }; 

     b.setOnClickListener(lsn); 
    } 

    ItemData currItem = m_Items.get(position); 

    // Some fields data bindings to currItem 

    Button btn = (Button)v.findViewById(R.id.b); 
    btn.setEnabled(currItem.isButtonEnabled); 
    btn.setTag(currItem.getID()); 

    return v; 
} 

:

<ListView android:layout_width="fill_parent" android:id="@+id/android:list" 
      android:fadingEdge="none" android:divider="@color/transparent" android:dividerHeight="2dp" 
      android:background="@color/transparent" android:focusable="false" 
      android:cacheColorHint="@color/transparent" android:layout_height="fill_parent"></ListView> 

어떤 생각? 감사합니다.


중요 업데이트 : 내가 잘못 클릭지고 어떤 항목에 어떤 일관성이 있음을 눈치 좀 더 테스트 후

. 그것은 항상 거울의 물건입니다. 즉 목록의 첫 번째 항목을 클릭 할 때 다른 항목이 표시되면 항상 마지막 항목입니다.

예 : 목록에 3 개의 항목이있는 경우 첫 번째와 마지막 부분은 서로를 참조하지만 중간 항목은 참조하지 않으며 중간 항목은 항상 예상대로 작동합니다. 마치 어딘가에 항목의 역순으로 다른 목록이 있습니다. 때로는 일반 색인어 대신 미러 색인을 얻습니다.

정말 이상합니다! 대부분 내가 뭔가 잘못하고있는 것 같지만 일어날 수있는 상황을 생각할 수 없습니다.

내가 클래스에 배열 어댑터를 변환 한

는 ArrayList를 함께 baseAdapter를 확장하지만 문제가 계속 ...

마지막 업데이트 ... 그래서 나는이 문제가 경우에만 일어나는 것을까지 발견 notifyDatasetChanged가 백그라운드에서 실행 중입니다. 그러나 나는 단지 2 초마다 하나씩 호출을 줄일 수있다. 문제를 일으키는 것이 더 힘들지 만 그곳에는 아직 남아 있습니다 ...

어떤 단서?

+0

배열의 개체 목록을 변경 한 후에 문제가 발생합니까? 그렇다면 listView를 새로 고쳤습니까? – Wizetux

+0

두 개의 버튼이 참조되어 있다는 사실이 가장 혼란 스럽습니다. R.id.b에 의해 참조되는 click 이벤트를 발생시키는 버튼은 태그가 첨부 된 단추 (R.id.button에 의해 참조 됨)와 다른 단추입니다. 나는 활동이 적절한 id 값으로 어떻게 시작되는지를 보지 못했다! – Devunwired

+0

ListActivity에 대한 전체 코드를 추가 할 수 있습니까? 이 문제는 getView 메소드가/setup이라고 불리는 방법에 달려 있습니다. – Bryan

답변

0

문제가 OnClick 함수에 있는지 궁금합니다. OnClick 정의에 정의 된 'v'에서 태그를 가져 오는 "v"또는 getView 함수의 첫 번째 행에서 정의하는 범위는 범위에 따라 결정됩니까? 컴파일러에서 변수 이름을 더 명확하게 변경하고 동일한 문제가 발생하는지 확인하십시오.

+0

좋습니다. 나는 그것이 다른 범위 여야하기 때문에 그것이 중요하지 않다고 생각했다. 그러나 나는 그것을 바꿨다. 문제는 여전히 거기에 있습니다 ... – Shlomi

0

convertView 변수에 더 나은 변수 이름을 사용하는 것에 대해서는 Wizetux에 동의하며 'v'대신에 무엇인가를 사용합니다.

그러나 뷰의 onclick을 재정의하는 대신 ListActivity를 확장하는 클래스에 코드가 있다고 가정하고 확장 할 ListActivity 클래스의 onListItemClick을 호출하거나 사용할 수 있습니까?

+0

사실 onClick은 버튼 클릭 이벤트이며, 전체 누를 필요는 없습니다. 그게 문제가되어야한다고 생각하니? – Shlomi

+0

아니요, 단추에서 어떤 단추 또는 목록 요소가 계속 켜져 있는지 확인할 수 있어야합니다. 전달 된 convertView 변수에서 설정된 첫 번째 'v'변수의 이름을 변경하면 문제를 쉽게 해결하고 디버깅 할 수 있습니다. – Bryan

+0

나는 아직도 이것을 조사하고있다. 까다로운 문제입니다. 웬일인지, 그리고 당신이 말한 것에서는 때로는 잘못된 이드가 의도로 전달됩니다. 한 버튼의 onClick이 해고당하는 것과 관련하여 어떤 혼란이있는 것처럼 보입니다. 한 가지 질문은 틀린 ID가 의도적 인 엑스트라에 전달되었을 때입니다. 그 버튼은 이드입니까? – Bryan

0

onClickListener는 동일한 메서드 내에서 선언되고 정의되기 때문에 직접 정의해야합니다.

또한, 나는 확실하지 않다 그 버튼의 버튼 정의와 OnClickListener를해야 조건 내 "만약 (V = NULL)"... 직접 OnClickListener를 정의하는 대신 변수를 사용

예 :

버튼 b = (버튼) v.findViewById (R.id.b);

b.setOnClickListener (새 OnClickListener를() { @Override 공공 무효 온 클릭 (보기 V) { // 온 클릭 코드 } });

+0

v = null 섹션 외부에서 리스너를 이동했으며 onClick 리스너를 직접 정의했습니다. 변경 없음 ... – Shlomi

+0

Eclipse 디버거를 사용하여 프로그램을 실행 했습니까? 그렇지 않은 경우 버튼 b 버튼의 onclick에 중단 점을 넣는 것이 도움이 될 수 있습니다. 버튼 태그의 값이 무엇인지, 뷰 위치가 무엇인지, 목록 요소의 위치가 무엇인지, 그리고 다른 변수 값이 도움이된다고 생각되면 게시하십시오. 또한이 복잡한 문제를 해결하는 데 도움을 드릴 것입니다. – Bryan

+0

나는 실제로 eclipse와 로깅 정보로 디버깅하고있다. 현재 터치 및 포커스 이벤트를 버튼에 추가했습니다. 포커스 이벤트는 실행되지 않지만 터치 이벤트는 발생하지 않습니다. 버튼을 클릭 할 때 터치 이벤트는 대개 동일한 뷰 태그를 사용하여 두 번 발생하지만 대개 한 번은 잘못된 태그 (다른 목록 항목 중 하나)와 함께 표시된다는 것을 알 수 있습니다. 터치 이벤트가 발생하면 click 이벤트를 볼 수 있으며, 이전 터치 이벤트가 모두 동일한 올바른 태그를 가져오고있는 경우에도 click 이벤트가 잘못된 이벤트로 바뀌는 경우가 있습니다! 정말 도움을 주셔서 감사합니다 !! – Shlomi

관련 문제