我有一个由适配器填充的Gridview,它返回LinearLayouts,每个包含一个ImageButton和TextView。
在适配器中,我将onClick和onLongClick事件绑定到ImageButton。
我正在尝试将OnItemClickListener绑定到gridview,但我不知道为什么onItemclicked从未启动过。
这是我第六个小时没有任何东西。
顺便说一下; OnItemSelectListener在Grid上完美运行。我正在检查某段代码是否意外处理了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 :(得分:78)
不要在网格中使用可点击的对象。在这种情况下,Android无法处理GridView
的点击事件。
相反,使用某些东西来显示类似的用户界面视图。然后处理该对象的单击操作。
请勿:将Button
放入GridView
以执行某些点击操作。
执行:设置ImageView
代替ImageButton
并处理ImageView
点击事件。
答案 1 :(得分:13)
如果您想使用Button
或ImageButton
,则需要在小部件的xml代码中编写这些属性。
android:focusable="false"
android:focusableInTouchMode="false"
它适用于我。
但是在GridView中,尽量避免使用这些小部件。您可以使用任何其他小部件代替这些小部件(如ImageView或任何其他小部件)。
答案 2 :(得分:3)
还要确保您的ListAdpter为
返回truepublic boolean isEnabled(int _position)
表示您要点击的位置。
答案 3 :(得分:1)
Hey guyz终于找到了解决方案......
我们正在做的是直接访问GridView中的布局,因此onItemClickListener发现访问该项目会让人感到困惑。
所以解决方案是在适配器内部应用onClickListener(即通常为ArrayAdapter)
所以我想说的是:
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;
}
答案 4 :(得分:1)
尝试设置
android:clickable="false"
android:focusable="false"
答案 5 :(得分:0)
我也遇到同样的问题,原因有几个。 所以,这是我的提示:
我刚刚在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;
}