OnItemClickListener不工作,但OnItemLongClickListener正在使用GridView

我在我的gridview clickListener有问题。 LongClickListener的工作没有问题。 但我似乎无法得到任何响应从点击监听器。

我的代码如下。

我很困惑,为什么长期的点击工作,而不是正常的点击,

任何指针将不胜感激

谢谢

final GridView gridView = (GridView) findViewById(R.id.grid_view); gridView.setNumColumns(numOfColumns); gridView.getLayoutParams().width = (CELL_WIDTH * numOfColumns); gridView.getLayoutParams().height = (CELL_WIDTH * numOfRows); .... gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { Log.d("ABCD", "Position Single Click is " + position); // Ideally in here I want to put to open a soft keyboard for the user to enter a value // InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); // imm.showSoftInput(gridView, InputMethodManager.SHOW_IMPLICIT); } }); gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { Log.d("ABCD", "Position Long Click is " + position); return true; } }); 

grid_view是

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:descendantFocusability="blocksDescendants" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:gravity="center" android:orientation="horizontal"> <View android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2"/> <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/my_grid_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="true"/> <<--- I WANT THIS TO GET THE CLICK <View android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2"/> </LinearLayout> <ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/listId" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="0dp" /> </LinearLayout> 

网格视图中的GridCell是

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:padding="0dp" android:layout_margin="0dp" android:focusable="false" android:clickable="false" android:focusableInTouchMode="false" > <TextView android:id="@+id/grid_item_number" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="1dp" android:paddingRight="0dp" android:paddingTop="0dp" android:paddingBottom="0dp" android:textSize="10px" android:focusable="false" android:clickable="false" android:focusableInTouchMode="false" > </TextView> <EditText xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/grid_item_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@+id/celllabel" android:background="@android:color/transparent" android:paddingLeft="5dp" android:paddingRight="0dp" android:paddingTop="0dp" android:paddingBottom="0dp" android:layout_margin="0dp" android:focusable="false" android:focusableInTouchMode="false" android:clickable="false" android:cursorVisible="false"> </EditText> </RelativeLayout> 

适配器类有一个getView,如下所示

 public View getView(final int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View gridView; MyObject obj = myObjects.get(position); if (convertView == null) { gridView = inflater.inflate(R.layout.grid_cell, null); String textColour = "#000000"; TextView textView = (TextView) gridView.findViewById(R.id.grid_item_label); textView.setText(Html.fromHtml(String.format("<font color='%s'>%s</font>", textColour, obj.getValue()))); TextView superScriptTv = (TextView) gridView.findViewById(R.id.grid_item_number); if (obj.getNumber() > 0) { superScriptTv.setText(Html.fromHtml(String.format("<font>%s</font>", cell.getNumber()))); } } else { gridView = convertView; } gridView.setBackgroundColor(obj.getBackgroundColour()); return gridView; } 

编辑真的撞我的头在这里的墙壁现在:)我更新代码示例,所以有更多的数据。 我注意到,在我的适配器,如果我没有设置ID = R.id.grid_item_number的textview上的文本,那么它的工作原理。 只要我设置文本,然后我失去了点击监听器。

链接的问题/答案不能帮助我所看到的。 任何人都可以帮助我的愚蠢?

编辑适配器代码已被添加。

提前致谢。

Solutions Collecting From Web of "OnItemClickListener不工作,但OnItemLongClickListener正在使用GridView"

问题是在row_cell里面的EditText 。 当您点击该项目时,需要重点关注,并防止整个项目再次被点击。 正如你注意到的,只有长时间的点击工作 在这里你有一个类似的问题。

要解决这个问题,我会把你的OnItemClickListeners从Activity / Fragment移动到你的GridViewAdapter ,而不是:

 gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { Log.d("ABCD", "Position Single Click is " + position); // Ideally in here I want to put to open a soft keyboard for the user to enter a value // InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); // imm.showSoftInput(gridView, InputMethodManager.SHOW_IMPLICIT); } }); gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { Log.d("ABCD", "Position Long Click is " + position); return true; } }); 

我会做这样的事情:

 @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View gridViewItem; if (convertView == null) { gridViewItem = new View(mContext); gridViewItem = layoutInflater.inflate(R.layout.grid_cell, null); TextView textView = (TextView)gridViewItem.findViewById(R.id.grid_item_number); textView.setText(mValues[position]); EditText editText = (EditText)gridViewItem.findViewById(R.id.grid_item_label); } else { gridViewItem = (View) convertView; } gridViewItem.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e("GRID", "onClick: " ); } }); gridViewItem.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Log.e("GRID", "onLongClick: " ); return true; } }); return gridViewItem; } 

这将防止你现在正在挣扎的这种奇怪的行为。

为了这个例子,请在下面find我的代码:

MainActivity布局:

 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="io.github.mmbs.gridviewcheck.MainActivity" tools:layout_editor_absoluteX="0dp" tools:layout_editor_absoluteY="0dp"> <GridView android:id="@+id/gridView" android:numColumns="auto_fit" android:columnWidth="100dp" android:stretchMode="columnWidth" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true"> </GridView> </android.support.constraint.ConstraintLayout> 

网格单元布局:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="0dp" android:clickable="false" android:focusable="false" android:focusableInTouchMode="false" android:padding="8dp"> <TextView android:id="@+id/grid_item_number" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="0dp" android:paddingLeft="1dp" android:paddingRight="0dp" android:paddingTop="0dp" android:textSize="20sp" android:text="TEXTVIEW"> </TextView> <EditText android:id="@+id/grid_item_label" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="0dp" android:background="@android:color/transparent" android:cursorVisible="false" android:layout_below="@id/grid_item_number" android:text="EDITTEXT"> </EditText> </RelativeLayout> 

请考虑,我删除了所有负责focusability布局属性。

MyGridAdapter:

 public class MyGridViewAdapter extends BaseAdapter { private Context mContext; private final String[] mValues; public MyGridViewAdapter(String[] values, Context context) { mValues = values; mContext = context; } @Override public int getCount() { return mValues.length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View gridViewItem; if (convertView == null) { gridViewItem = new View(mContext); gridViewItem = layoutInflater.inflate(R.layout.grid_cell, null); TextView textView = (TextView)gridViewItem.findViewById(R.id.grid_item_number); textView.setText(mValues[position]); EditText editText = (EditText)gridViewItem.findViewById(R.id.grid_item_label); } else { gridViewItem = (View) convertView; } gridViewItem.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e("GRID", "onClick: " ); } }); gridViewItem.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Log.e("GRID", "onLongClick: " ); return true; } }); return gridViewItem; } } 

如果你愿意,我也可以在github上分享这个代码,所以你将有一个完全可行的例子。

第二个select是保持你的实现原样,并且在EditText被关注和启用的情况下做黑客攻击。 在这里你有相关的主题:

  1. Android:强制EditText删除焦点?
  2. ListView项目关注行为
  3. ListView内的Focusable EditText
  4. Android:强制EditText删除焦点?

更重要的是,请考虑到这个答案:

不要在网格中使用可点击的对象。 在这种情况下,Android无法处理GridView的点击事件。

相反,使用某些东西来显示类似的用户界面视图。 然后处理该对象的点击操作。

不要:把Button放在GridView中来执行一些点击操作。

做:把一个ImageView而不是ImageButton,并处理ImageView的点击事件。

编辑:请在我的Github上find项目的链接 。

使用gridView.setOnItemClickListener(.....) 你的根视图添加下面的行

 android:descendantFocusability="blocksDescendants" 

ViewGroup将阻止它的后代接受焦点。

happyCoding;

尝试添加

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

在你的GridCell – > TextView中

如果您对此感到满意,请尝试使用回收站视图。

除此之外,它没有给出任何这样的问题,它有它自己的优势。

按照链接完整的说明。

如果你有你的行布局的任何焦点能够查看,那么onItemClickListener将不会被调用。 对于这个问题,您需要自定义您的getView代码,并在convertView上设置onClickListener(),并使用接口将callback传递给活动。 我已经更新了适配器的代码,如下所示。 现在,您需要在您的活动上实现GridViewItemClickListener,并在创buildAdapter实例时传递该实例。

  public class MyGridViewAdapter extends BaseAdapter { private Context mContext; private final String[] mValues; private GridViewItemClickListener mListener; public MyGridViewAdapter(String[] values, Context context,GridViewItemClickListener listener ) { mValues = values; mContext = context; mListener = listener; } @Override public int getCount() { return mValues.length; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { LayoutInflater layoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View gridViewItem; if (convertView == null) { gridViewItem = new View(mContext); gridViewItem = layoutInflater.inflate(R.layout.grid_cell, null); TextView textView = (TextView)gridViewItem.findViewById(R.id.grid_item_number); textView.setText(mValues[position]); EditText editText = (EditText)gridViewItem.findViewById(R.id.grid_item_label); } else { gridViewItem = (View) convertView; } gridViewItem.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { Log.e("GRID", "onLongClick: " ); return true; } }); //Add an OnclickListener here gridViewItem.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mListener != null){ mListener.onGridItemClick(v, position); } } }); return gridViewItem; } public interface GridViewItemClickListener{ void onGridItemClick(View v, int index); } } 

你可以点击适配器内部的用户点击它将工作,它应该像这样工作

public View getView(final int position,View convertView,ViewGroup parent){LayoutInflater inflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

  View gridView; MyObject obj = myObjects.get(position); if (convertView == null) { gridView = inflater.inflate(R.layout.grid_cell, null); String textColour = "#000000"; TextView textView = (TextView) gridView.findViewById(R.id.grid_item_label); textView.setText(Html.fromHtml(String.format("<font color='%s'>%s</font>", textColour, obj.getValue()))); TextView superScriptTv = (TextView) gridView.findViewById(R.id.grid_item_number); superScriptTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // here you can use every item of grid acc to position } }); if (obj.getNumber() > 0) { superScriptTv.setText(Html.fromHtml(String.format("<font>%s</font>", cell.getNumber()))); } } else { gridView = convertView; } gridView.setBackgroundColor(obj.getBackgroundColour()); return gridView; } 

如果将GridCell.java中的根元素设置为不可点击,那么点击侦听器如何工作?

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:padding="0dp" android:layout_margin="0dp" android:focusable="false" android:clickable="false" android:focusableInTouchMode="false" 

从GridCell.java中的每个组件中删除这些行

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

我不认为这是GridView所需要的,但有时对于RecyclerView,它需要在GridCell.java的根组件上具有android:clickable =“true”