我有GridView
个自定义View
,其中包含Button
和TextView
。我定义了setOnItemClickListener
,但看起来它从未被调用,请查看以下代码的和平。
gridview = (GridView) findViewById(R.id.main_gridview);
gridview.setAdapter(new GridAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(getApplicationContext(), "gadsfadsf",
Toast.LENGTH_SHORT).show();
Log.d("Main", "onItemClick");
}
});
答案 0 :(得分:19)
明显的答案是一种黑客攻击。而不是将onclicklistener设置为按钮,只需确保ButtonView和TextView具有以下属性:
android:clickable="false"
答案 1 :(得分:3)
我有同样的问题。虽然我还没弄清楚为什么它永远不会被调用,但我可以提出一个解决方法。
不是在GridView上设置onClickListener,而是在你的getView()方法内的GridAdapter内的Button本身上设置它。
这对我有用!
答案 2 :(得分:2)
可能是GridView中的某些项目正在窃取焦点。尝试将这些属性添加到网格内的任何元素:
android:focusable="false"
android:focusableInTouchMode="false"
答案 3 :(得分:1)
而不是在onClickListener
上设置GridView
,
在您Button
方法内的GridAdapter
内的getView()
上设置它。
这对我有用!
答案 4 :(得分:1)
我遇到了同样的问题,事件grid.itemClickListener
从未启动过。
在我的情况下,我有两个听众:grid.itemClickListener
和另一个clickListener
附加到项目布局中的Button
。
在摆弄布局一段时间之后,我意识到如果在项目的布局中有一个小部件,focusable=true
,则itemClickListener
从未启动。附加到clickListener
的{{1}}效果很好。
也许这就是你的情况。无论如何,我认为这些信息对于遇到同样问题的其他用户可能会有用。
答案 5 :(得分:1)
Thanx to CodingUser
我们正在做的是直接访问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;
}
答案 6 :(得分:0)
你可以在GridView的适配器中设置OnClick for view。它对我有用。
public View getView(final int position, View convertView, ViewGroup parent) {
ObjMenuVideo objListVideo = mListMenuVideo.get(position);
final ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item_video_of_kind, null);
holder.tv_number_views = (TextView) convertView
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv_number_views.setText(String.valueOf(objListVideo.getViews()));
convertView.setId(position);
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent menuVideoIntent = new Intent(mContext,
ActivityDetailVideo.class);
mContext.startActivity(menuVideoIntent);
}
});
return convertView;
}