我的代码如下
我很困惑为什么长的点击工作,但不是正常的点击,
任何指针都将不胜感激
谢谢
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,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; }
编辑
现在真的把我的头撞在墙上:)
我更新代码示例,所以有更多的数据.我注意到在我的适配器,如果我不设置文本在textview与ID = R.id.grid_item_number然后它的工作.一旦我设置文本,那么我失去了点击监听器.
链接的问题/答案没有帮助我看到.任何人都可以帮助我的愚蠢吗?
提前致谢.
解决方法
Here you have a similar problem.
为了解决这个问题,我将把OnItemClickListeners从Activity / Fragment移动到GridViewAdapter中,而不是:
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent,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,long id) { Log.d("ABCD","Position Long Click is " + position); return true; } });
我会做这样的事情:
@Override public View getView(int position,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; }
这将阻止你现在正在努力的这种奇怪的行为.
为了这个例子,请在下面找到我的代码:
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>
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,"onLongClick: " ); return true; } }); return gridViewItem; } }
如果你喜欢,我也可以在github上分享这个代码,所以你将有一个完全可操作的例子.
第二个选择是将您的实现保留为原样,并在EditText可对焦并启用时执行hacks操作.这里有相关主题:
> Android: Force EditText to remove focus?
> ListView items focus behaviour
> Focusable EditText inside ListView
> Android: Force EditText to remove focus?
此外,请考虑that answer:
Do not use clickable objects in the grid. In that case Android cannot handle the click event of GridView.
Instead,use something to show a similar user interface view. Then handle that object’s click actions.
Don’t: put Button in the GridView to perform some click actions.
Do: put an ImageView instead of ImageButton and handle ImageView’s click events.