2012-03-01 29 views
1

我們生成了幾個ListView,它們爲用戶保存信息以過濾另一個片段中的信息。它工作正常,除非你暫停和恢復應用程序(例如,背景或鎖定屏幕)。一旦你這樣做,列表可以滾動,但不能點擊。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似乎沒有效果,這個bug在添加之前和之後都存在。

每個都綁定到顯示或隱藏列表的按鈕。

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); 
      } 
     } 
    }); 

點擊此按鈕隱藏,然後顯示ListView控件(這與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控件本身:

<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

而你試圖註釋掉你暫停/繼續回調,看他們是否不影響這份清單視圖? – 2012-03-01 22:06:36

+0

是的。簡歷沒有回調,並且唯一一個暫停沒有效果。 – Calvin 2012-03-01 23:42:37

+0

將我們的OnItemClickListener代碼移動到各個列表項中的getView()調用中生成的各個OnClickListeners中,這個問題就會消失。雖然這是一個可接受的解決方法,但它很有趣。 – Calvin 2012-03-03 21:57:32

回答

0

我的應用程序(擴展SurfaceView在恢復後失去觸摸事件)有類似的問題,並通過調用onResume()實現中的setFocusable(true)來解決它。顯然這個觀點沒有得到重點,因此沒有收到觸摸事件。不確定這是否是這種情況,但值得嘗試。

+0

試過了,但沒有骰子。 – Calvin 2012-03-01 23:57:07

0

記得我曾經遇到過類似的片段活動問題。佈局請求被阻止時,我遇到了一些情況,它們並沒有導致實際的佈局遍歷。 我在Enroscar libraryBaseFragment類)用的代碼片段類下面的代碼片段固定它:

@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 2012-03-03 19:45:01

+0

使用Android來源和Eclipse調試。如果您的源代碼與仿真器的API級別相對應,則調試起來要容易得多。 – 2012-03-06 12:28:08