我有一个显示GridView
网格的Buttons
适配器。现在我想为我的按钮设置OnClickListener
,但当然他们没有自己的R.id我可以通过适配器添加到网格中,而不是layout.xml
我尝试使用OnItemClickListener
,如下所示:
m_onItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int pos, long l) {
switch(pos) {
case MyConstants.POS_OF_BUTTON_1:
// Do stuff...
break;
case MyConstants.POS_OF_BUTTON_2:
// Do stuff...
break;
}
}
};
但据我了解,您无法使用clickable
或focusable
项目OnItemClickListener
。我怎么绕这个?谢谢!
答案 0 :(得分:0)
有更多优雅的方法来完成这一切(从使用带有GridLayoutManager而不是GridView的RecyclerView开始),但是如果您正在寻找快速简便的解决方案来使用已有的东西,这就是你能做的:
首先,你应该在你的按钮上设置一些ID,它们不必来自R.id(尽管如果你从布局中夸大了视图,并在那里定义了ID,那将是更好的选择,并使用ViewHolder)。
最坏的情况是,您可以在适配器中为每个种类按钮(例如static final int DELETE_BUTTON = 1;
)定义ID,然后在按钮上设置这些ID在代码中手动。
然后,你可以传递一个简单的OnClickListener(不是OnItemClickListener ),它可以处理单个项目中所有这些不同按钮的点击,并传递给你的适配器,并使适配器在每个按钮上设置监听器按钮,用于网格中的每个项目视图。
您还需要将项目的位置设置为按钮视图本身的标记,以便在点击发生时,您可以确定点击发生的项目。
示例代码如下:
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Object tag = v.getTag();
if (!(tag instanceof Integer)) {
// Show error message or just throw an exception.
}
int position = (Integer) tag;
// We get the item at this position, to know which one to use
Item item = adapter.getItem(position);
switch (v.getId()) {
case DELETE_BUTTON:
// Delete stuff here
break;
case EDIT_BUTTON:
// Edit stuff here
break;
...
}
}
};
adapter.setOnClickListener(listener);
然后,在适配器的getView
方法中,您需要在每个按钮上设置此侦听器,并将项目的位置设置为按钮上的标记。这样,您就可以在上面的监听器代码中找出按钮所属的项目。
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
...
deleteButton.setId(DELETE_BUTTON);
deleteButton.setOnClickListener(listener);
deleteButton.setTag(i);
...
}
一般来说,我真诚地敦促您在有空的时候查看ViewHolder模式,以及RecyclerView和GridLayoutManager。大部分内容也会在那里进行转换。
修改强>
为了使列表/网格项中的多个视图可单击/可聚焦,您需要在项目的根视图上将descendantFocusability
属性设置为blockDescendants
,或者只是在XML中,或通过以下代码:
viewGroup.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);