【问题标题】:OnItemClickListener not getting invoked on Button inside GridViewOnItemClickListener 未在 GridView 内的 Button 上调用
【发布时间】:2017-07-09 17:28:34
【问题描述】:

我正在尝试创建一个包含一些按钮的 GridView。按钮正在填充,但在单击 GridView 内的按钮时未调用 OnItemClickListener()。

活动类代码

gridView = (GridView) findViewById(R.id.gridview);
    gridView.setAdapter(new ButtonAdapter(getApplicationContext(),answer));
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,
                                int position, long id) {
            flipper.showNext();

        }
    });

自定义按钮适配器

public class ButtonAdapter extends BaseAdapter{

private Context context;
private int[] numbers = new int[100];
private String[] answer;

public ButtonAdapter (Context context,String[] answer){
    this.context = context;
    this.answer = answer;
    for(int i=0;i<100;i++){
        numbers[i] = i+1;
    }
}

@Override
public int getCount() {
    return numbers.length;
}

@Override
public Object getItem(int i) {
    return null;
}

@Override
public long getItemId(int i) {
    return 0;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {

    View gridView;
    LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if(view == null) {
        gridView = new View(context);
        gridView = inflater.inflate(R.layout.adapter, null);

    } else {
        gridView = (View) view;
    }

    Button button = (Button) gridView.findViewById(R.id.adapter_button);
    button.setText(numbers[i]+"");

    if(answer[i].equals("null"))
        button.setBackgroundColor(context.getResources().getColor(R.color.reset));
    else
        button.setBackgroundColor(context.getResources().getColor(R.color.optionCheck));

    return gridView;
}
}

adapter.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/adapter_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />
</LinearLayout>

acitvity_layout.xml

<GridView
        android:id="@+id/gridview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:numColumns="5"
        android:columnWidth="50dp"
        android:stretchMode="columnWidth"
        android:layout_below="@+id/back"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

【问题讨论】:

  • 你挂在 gridView 的 setOnItemClickListener 上,应该是按钮的 setOnItemClickListener?
  • 我正在关注 android 文档 (developer.android.com/guide/topics/ui/layout/gridview.html)。这里 setOnItemClickListener 设置在 gridview 上,而不是里面的元素。
  • @JeffUK 他的按钮位于由adapter.xml 填充的gridview 中。我对他的 getView 实现持怀疑态度,他在其中创建了一个新视图并返回它。为什么不返回他在参数中传递的相同视图!
  • 尝试实现 onItemClickListener 并在重写的函数中实现 onItemClick。你也确定你的 Flipper.showNext() 方法吗?
  • 是的,flipper.showNext() 方法很好。早些时候,我只使用 textviews 填充了 gridview,而不使用自定义适配器。那时对单个元素的点击是有效的。

标签: java android gridview android-arrayadapter


【解决方案1】:

您需要实现一个接口并让您的 Activity 通过接口监听器订阅特定的按钮按下。您的 ButtonAdapter 应该实现 onClickListener,但您的 Activity 应该使用您的自定义方法实现接口。 Activity 和 Adapter 是两个不同的世界,有两个不同的作用域。慢慢阅读这篇文章并遵循其逻辑。它应该让你朝着正确的方向前进:How to create interface between Fragment and adapter?

适配器处理 Fragment 的方式与处理 Activity 的方式几乎相同。

【讨论】:

  • 好的,这可能是一种方法。目前我正在寻找的是我在这里的代码有什么问题。
  • 好吧,对于初学者来说,您正在为 GridView 设置一个 onClickListener...而不是按钮。此外,如果不使用接口,您将无法向 Activity 注册任何 UI 交互。我建议你使用一个界面。
  • 是的,那是我做错的事情。我在适配器内的按钮上设置了 OnClickListener 并开始工作。
猜你喜欢
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多