2013-08-30 28 views
9

我有一個ListView,佔用了整個屏幕,但有時它並沒有在它足夠的項目完全覆蓋ListView部件。我希望能夠響應最後一個沒有包含項目的項目下的空白空間的點擊(這意味着setOnItemClickListener不合適)。如何聆聽列表項目外發生的ListView上的單擊事件?

我試過setOnClickListener(他們禁止ListView本身)在父視圖上,但點擊似乎沒有達到它。我也在ListView上試過setOnTouchListener,但是由於某種原因導致某些項目點擊未註冊。任何想法如何實現這一目標?

+3

FWIW效果很好,我提交的問題得到了'setOnClickListener()'限制解除,當你做一個良好的出發點:http://code.google.com/p/android/issues/detail?id=59559 – CommonsWare

回答

0

一種可能的實現方式是將您的ListView設置爲height="wrap_content"如果您這樣做,那麼您可以覆蓋onTouchEvent()以便從用戶觸摸空白處獲取事件。

Layout.xml

<ListView 
    android:id="@+id/list" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:entries="@array/list" /> 

Activity.java

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ListView mList = (ListView)findViewById(R.id.list); 
     mList.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View v, int pos,long id) { 
       Toast.makeText(v.getContext(), ""+pos, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 
    @Override 
    public boolean onTouchEvent(MotionEvent me){ 
     if(me.getAction() == MotionEvent.ACTION_DOWN){ 
      Toast.makeText(this, "Empty space", Toast.LENGTH_SHORT).show(); 
      return true; 
     } 
     return false; 
    } 
} 

但是,如果你在你的ListView的高度是match_parent計數出於某種原因(即背景繪製),那麼這韓元不是一個理想的解決方案。

+0

你有沒有嘗試過這樣或你知道了手,如果ListView控件與WRAP_CONTENT交互得很好?這直接影響了我的直覺,因爲它不能很好地處理:不是要測量所有ListView的子項? – Foxichu

+0

我確實嘗試過。在模擬器上運行,似乎工作正常。 – FoamyGuy

0

將ListView控件下方的空的LinearLayout通過適當的高度設置爲列表視圖。將onClick()方法放置到該線性佈局。那必須這樣做。

5

跑進類似的問題,我需要點擊空白處時關閉擴展列表元素。這是我如何解決它。

public class CustomListView extends ListView { 

    private OnNoItemClickListener mOnNoItemClickListener; 

    public interface OnNoItemClickListener { 
    void onNoItemClicked(); 
    } 

    public CustomListView(Context context) { 
    super(context); 
 } 

    public CustomListView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 

    public CustomListView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
    //check whether the touch hit any elements INCLUDING ListView footer 
    if(pointToPosition((int) (ev.getX() * ev.getXPrecision()), 
     (int) (ev.getY() * ev.getYPrecision())) == -1 && ev.getAction() == MotionEvent.ACTION_DOWN) { 
     if(mOnNoItemClickListener != null) { 
     mOnNoItemClickListener.onNoItemClicked(); 
     } 
    } 
    return super.dispatchTouchEvent(ev); 
    } 

    public void setOnNoItemClickListener(OnNoItemClickListener listener) { 
    mOnNoItemClickListener = listener; 
    } 

} 

然後在你的XML文件,而不是常規的ListView使用CustomListView和實施OnNoItemClickListener您的活動/片段內,並調用mListView.setOnNoItemClickListener(本);在onCreate中啓用回調函數onNoItemClicked()。

請注意,如果您的ListView有頁眉或頁腳,那麼這些被認爲是列表元素和onNoItemClicked()將不會被調用。

0

結合一些其他的答案,我想出了這個,對我的使用情況

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ... setup list view and other view state 
    listView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN && 
      listView.pointToPosition((int) (event.getX() * event.getXPrecision()), (int) (event.getY() * event.getYPrecision())) == -1) { 
     collapseExpandedListItem(); 
     return true; 
     } 
     return false; 
    } 
    }); 
} 
相關問題