gpt4 book ai didi

android - OnItemClickListener 不工作但 OnItemLongClickListener 正在处理 GridView

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:38:12 26 4
gpt4 key购买 nike

我的 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>

GridView 中的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 上设置文本,那么它就可以工作。一旦我在上面设置了文本,我就失去了点击监听器。

据我所知,链接的问题/答案没有帮助。任何人都可以帮助解决我的愚蠢问题吗?

编辑添加了适配器代码。

提前致谢。

最佳答案

问题出在 row_cell 中的 EditText。当您单击该项目时,它会获得焦点并防止再次单击整个项目。正如您所注意到的,只有长按才有效。 Here you have a similar problem.

要解决该问题,我会将您的 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;

}

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

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

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 的布局属性。

我的网格适配器:

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上,这样你就有了一个完整的可操作的例子。

第二个选项是让您的实现保持原样,并在 EditText 可聚焦并启用时进行修改。这里有相关主题:

  1. Android: Force EditText to remove focus?
  2. ListView items focus behaviour
  3. Focusable EditText inside ListView
  4. 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.

编辑:请找一个link to the project on my Github .

关于android - OnItemClickListener 不工作但 OnItemLongClickListener 正在处理 GridView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37181389/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com