2012-03-01 1 views
1

사용자가 다른 조각의 정보를 필터링하는 정보를 보유하는 여러 ListViews를 생성합니다. 응용 프로그램을 일시 중지했다가 다시 시작하지 않으면 (예 : 화면을 잠그거나 화면을 잠그지 않는 한) 정상적으로 작동합니다. 그렇게하면 목록을 스크롤 할 수는 있지만 클릭하지는 못합니다.ListView는 터치를 받지만 일시 중지 및 다시 시작 후에는 onItemClickListener가 클릭을받지 않습니다.

목록 생성 코드 :

private View addList(LayoutInflater inflater, ViewGroup container, final FilterValue.SearchCategory type, final String[] labels) { 
    ArrayAdapter<String> adapter = generateArrayAdapter(inflater, labels, type); 
    if(adapter == null) { 
     return null; 
    } 
    filterAdapters.add(adapter); 

    ListView list = (ListView) inflater.inflate(R.layout.on_demand_filter_list, container, false); 

    list.setAdapter(adapter); 
    list.setItemsCanFocus(false); 
    list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    list.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 
    list.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(final View view, final MotionEvent motionEvent) { 
      LOG.d(TAG, "NO TOUCHING!"); 
      return false; //To change body of implemented methods use File | Settings | File Templates. 
     } 
    }); 
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
      LOG.d(TAG, "onItemClick!"); 
      CheckedTextView textView = (CheckedTextView) view.findViewById(R.id.title); 
      textView.toggle(); 
      if (textView.isChecked()) { 
       filterValue.addToSelectedList(labels[i], type); 
      } else { 
       filterValue.removeFromSelectedList(labels[i], type); 
      } 
     } 
    }); 
    list.setAdapter(adapter); 
    list.setVisibility(View.GONE); 
    filterListContainer.addView(list); 

    return list; 
} 

onTouch 리스너 만 터치를 수신하기 위해 존재한다. DescendantFocusability는 효과가없는 것처럼 보입니다.이 버그는 추가되기 전후에 존재합니다.

각각은 목록을 표시하거나 숨기는 버튼에 묶여 있습니다. 다음 숨기려면이 버튼을 누르면

titleHeader.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View clickedView) { 
      closeNetworkList(); 
      closeGenreList(); 
      titlesOpen = !titlesOpen; 
      ImageView indicator = (ImageView) clickedView.findViewById(R.id.filter_expansion_indicator_icon); 
      if (indicator != null) { 
       if (titlesOpen) { 
        indicator.setImageResource(R.drawable.arrow_filter_up); 
       } else { 
        indicator.setImageResource(R.drawable.arrow_filter_down); 
       } 
      } 
      if (titlesOpen) { 
       titlesListView.setVisibility(View.VISIBLE); 
      } else { 
       titlesListView.setVisibility(View.GONE); 
      } 
     } 
    }); 

(addList로 생성 된) 뭔가를 재설정 목록보기를 표시하고 항목을 다시 클릭 할 수 있습니다. 항목 행에 대한

XML :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:padding="8dp" 
      android:orientation="horizontal"> 

<CheckedTextView 
     android:id="@+id/title" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textColor="@drawable/on_demand_filter_checked_text_sel" 
     android:gravity="center_vertical" 
     android:paddingLeft="76dp" 
     android:focusable="false" 
     android:focusableInTouchMode="false" 
     android:drawableLeft="@drawable/checkbox_sel" 
     android:drawablePadding="14dp" 
     style="@style/LargeRegular"/> 

</LinearLayout> 

focusables는 새롭게 추가 된, 그러나 어느 쪽도했다. 문제가 추가되기 전에 문제가 발생했습니다.

목록보기 자체 : 내 절대 순발력 '끝에서 나는

<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="275dp" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="5dp" 
     android:divider="@color/Transparent" 
     android:descendantFocusability="blocksDescendants" 
     android:cacheColorHint="#ffffff"/> 

. 우리 팀의 아무도 이것에 대한 현명한 해결책이 없습니다. 일시 중지하고 다시 시작할 때까지 제대로 작동합니다. 우리는 이력서 나 일시 중지의 견해를 만지는 것은 절대적으로하지 않습니다. 누구든지 도와 줄 수 있습니까? 필요에 따라 더 자세한 정보를 제공 할 수 있습니다.

+0

을 그리고 당신은/당신의 일시 정지를 주석들은이 목록에 영향을주지 않습니다 여부를 확인하기 위해 콜백을 재개하기 위해 노력했다 전망? –

+0

예. 이력서에는 콜백이 없으며 일시 중지 된 것은 재개되지 않습니다. – Calvin

+0

OnItemClickListener 코드를 개별 목록 항목의 getView() 호출에서 생성 된 개별 OnClickListener로 이동하면이 문제가 해결됩니다. 이것은 가능한 해결 방법이지만 흥미 롭습니다. – Calvin

답변

0

내 응용 프로그램 (확장 된 SurfaceView가 다시 시작한 후에 터치 이벤트가 손실 됨)과 비슷한 문제가 있었으며 onResume() 구현에서 setFocusable (true)을 호출하여 해결했습니다. 외관상으로는 초점이 맞지 않아 터치 이벤트를받지 못했습니다. 이것이 여기에 해당되는지는 잘 모르겠지만 시도해 볼 가치가 있습니다.

+0

시도했지만 주사위는 사용하지 않았습니다. – Calvin

0

조각 활동과 비슷한 문제가 있음을 기억합니다. 레이아웃 요청이 차단되었을 때 실제 레이아웃 트래버스가 발생하지 않은 경우가있었습니다. 나는 조각 클래스의 코드를 다음 코드로 Enroscar library (BaseFragment 클래스)에 고정했습니다

@Override 
    public void onStart() { 
    // ... other staff ... 
    super.onStart(); 
    /* 
     XXX I don't know the reason but sometimes after coming back here from other activity all layout requests are blocked. :(
     It looks like some concurrency issue or a views tree traversal bug 
    */ 
    final View contentView = getActivity().findViewById(android.R.id.content); 
    if (contentView != null) { 
     final ViewParent root = contentView.getParent(); 
     if (contentView.isLayoutRequested() && !root.isLayoutRequested()) { 
     if (DebugFlags.DEBUG_GUI) { Log.i("View", "fix layout request"); } 
     root.requestLayout(); 
     } 
    } 
    } 
+0

시도해보십시오. 어떻게 이런 종류의 것을 디버깅 했습니까? ListView가 만들 수있는 모든 호출에 대해 디버그 명령문을 작성하도록 전체 클래스를 재정의하는 것보다 무슨 일이 일어나고 있는지 파악하는 것은 당황 스럽습니다. – Calvin

+0

사용 된 Android 소스 및 Eclipse 디버깅. 에뮬레이터의 API 레벨에 해당하는 소스가있는 경우 디버그하는 것이 훨씬 쉽습니다. –

관련 문제