2011-11-18 48 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; 
    }