2011-11-18 89 views
26

我有一個由適配器填充的GridView,它返回LinearLayouts,每個都包含一個ImageButton和TextView。OnItemClickListener在Android上沒有觸發GridView

在適配器中,我將onClick和onLongClick事件綁定到ImageButton。

我想綁定OnItemClickListener到gridview,但我不知道爲什麼onItemclicked從來沒有啓動。

這是我第六個小時沒有任何東西。

順便說一下; OnItemSelectListener在網格上完美工作。

我正在檢查一些代碼是否意外地處理了onItemClicked,但還沒有發現。

我需要幫助的人。

gridView = (GridView) layoutInflater.inflate(R.layout.gridview, null); 
gridView.setOnItemClickListener(new ItemClickListener()); 
. 
. 
. 

//inner handler class 
class ItemClickListener implements AdapterView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
     Toast.makeText(mainActivity.getApplicationContext(),view + " clicked at pos " +    
     i,Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

是否有logcat的任何異常? –

+1

沒有。因爲我沒有發現任何異常,我會看到應用程序崩潰。我不會嗎? –

+0

我沒有看到這段代碼有什麼問題,也許問題出在別的地方。 – Caner

回答

73

請勿在網格中使用可點擊的對象。在這種情況下,Android無法處理GridView的點擊事件。

而是使用某些東西來顯示類似的用戶界面視圖。然後處理該對象的點擊操作。

不要:ButtonGridView執行一些點擊操作。

務必:把一個ImageView代替ImageButton和處理ImageView的單擊事件。

+0

例如,在'GridView'的子類中的子類'AdapterView'中: '@Override public View getView(final int position,View convertView,ViewGroup parent){ImageView imageView = new ImageView(getContext()); imageView.setOnClickListener(new OnClickListener(){ @Override onClick(View v){ if(getOnItemClickListener()!= null){ getOnItemClickListener()。onItemClick(MyGridView.this,v,position,getItemId(position)); } 回報的ImageView; }' – EricRobertBrewer

+0

http://stackoverflow.com/questions/36474607/android-onkeylistener-with-filter-stop-onitemclicklistener-from-dpad 能否請您看看這個類似queston –

3

還要確保,你ListAdpter爲

公共布爾的IsEnabled(INT _position)返回true

你要點擊的位置。

1

嘿guyz終於得到了解決......

我們在做什麼,直接訪問GridView控件內部的佈局,所以onItemClickListener發現它混淆訪問項目。

因此,解決方案是應用適配器內部onClickListener(即通常ArrayAdapter)

有啥I M想說的是:

public View getView(int position, View convertView, ViewGroup parent) { 

      //Here row is a view and we can set OnClickListener on this 
    final View row; 
    ViewHolder holder = null; 

    if (convertView == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     //Here we inflate the layout to view (linear in my case) 
     row = inflater.inflate(layoutResourceId, parent, false); 
     holder = new ViewHolder(); 
     holder.imageTitle = (TextView) row.findViewById(R.id.text); 
     holder.image = (ImageView) row.findViewById(R.id.image); 
     row.setTag(holder); 
    } else { 
     row = convertView; 
     holder = (ViewHolder) row.getTag(); 
    } 

    ImageItem item = data.get(position); 
    holder.imageTitle.setText(item.getTitle()); 
    holder.image.setImageBitmap(item.getImage()); 

    //Now get the id or whatever needed 
    row.setId(position); 
    // Now set the onClickListener 
    row.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Toast.makeText(context, "Clicked" + row.getId() + "!!", 
        Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    return row; 
} 
12

如果你想使用ButtonImageButton那麼你需要在小部件的XML代碼寫這些屬性。

android:focusable="false" 
android:focusableInTouchMode="false" 

它的作品適合我。

但在GridView中,儘量避免使用這些小部件。您可以使用任何其他小部件來代替這些小部件(如ImageView或任何其他小部件)。

+0

奇怪如果你爲它設置了一個onclicklistener,但是仍然可以讓你點擊並觸發按鈕,但是如果你點按其他任何地方,你可以點擊網格項目。 –

+0

我必須把它同時用於兒童和父視圖。包括佈局和「非cli ckable「的觀點。奇怪,不是嗎? –

+0

很棒的答案。非常感謝MPG! – richc

0

嘗試設置

android:clickable="false" 
    android:focusable="false" 
0

我遇到同樣的問題太多,因爲幾個原因。 所以,這裏是我的祕訣:

  1. 擴展BaseAdapter您的適配器;
  2. 使用OnClickListener的getView內適配器,而不是設置OnItemClickListenerGridView的;
  3. 避免設置LayoutParams多次;
  4. 檢查位置= 0,不要使用convertView,充氣新的查看;
  5. OnClickListener不僅爲父母查看,但對於任何一個孩子查看(如有);
  6. 讓所有的查看 s點擊。

我剛剛在4個設備上測試過,並且此解決方案按預期工作。希望,這將有助於你的情況。 糾正我,如果我犯了錯誤。

佈局XML代碼:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:background="#273238" 
    android:clickable="true" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:padding="1dp"> 

<ImageView 
    android:id="@+id/open_image_item_imageview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:src="@drawable/loh" 
    android:clickable="true" 
    android:focusable="false" 
    android:focusableInTouchMode="false" 
    android:scaleType="centerCrop"/> 
<TextView 
    android:id="@+id/open_image_item_textview" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:clickable="true" 
    android:focusable="false" 
    android:focusableInTouchMode="false" 
    android:layout_gravity="bottom" 
    android:padding="4dp" 
    android:textSize="10sp" 
    android:ellipsize="start" 
    android:background="#55000000" 
    android:textColor="#FFFFFF" 
    android:text="image name"/> 

</FrameLayout> 

適配器代碼的Java:

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = null; 
     if(convertView != null && position != 0) 
      view = convertView; 
     else{ 
      view = LayoutInflater.from(getContext()).inflate(R.layout.open_image_item_layout, null, false); 
      view.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT, size)); 
     } 

     TextView textView = (TextView)view.findViewById(R.id.open_image_item_textview); 
     ImageView imageView = (ImageView)view.findViewById(R.id.open_image_item_imageview); 

     ... 

     View.OnClickListener onClickListener = getOnClickListener(files[position]); 
     view.setOnClickListener(onClickListener); 
     textView.setOnClickListener(onClickListener); 
     imageView.setOnClickListener(onClickListener); 

     return view; 
    }