为什么onClickListener在这个例子中不再起作用?

时间:2017-10-19 15:34:54

标签: android gridview

我正在尝试按照示例here在Android中创建一个GridView,只有按钮除了图像。这是我改变的代码:

public class ButtonAdapter extends BaseAdapter {
    private Context mContext;
    private String[] filesnames = {
            "File 1",
            "File 2",
            "Roflcopters",
            "File 1",
            "File 2",
            "Roflcopters",
            "File 1",
            "File 2",
            "Roflcopters",
            "File 1",
            "File 2",
            "Roflcopters"
    };

    public ButtonAdapter(Context c) {
        mContext = c;
    }

    public int getCount() {
        return filesnames.length;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        Button btn;
        if (convertView == null) {
            // if it's not recycled, initialize some attributes
            btn = new Button(mContext);
            btn.setLayoutParams(new GridView.LayoutParams(100, 85));
            btn.setPadding(8, 8, 8, 8);
        }
        else {
            btn = (Button) convertView;
        }                       

        btn.setText(filesnames[position]);
        // filenames is an array of strings
        btn.setTextColor(Color.WHITE);
        btn.setBackgroundResource(R.drawable.sample_0);
        btn.setId(position);

        return btn;
    }
}

当然,我略微更改了主要的java代码,因为我已经将此适配器和活动命名为不同:

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.select_route);

    GridView gridview = (GridView) findViewById(R.id.selectroute_view);
    gridview.setAdapter(new ButtonAdapter(this));

    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,
                                int position, long id) {
            Toast.makeText(SelectRoute.this, "" + position,
                    Toast.LENGTH_SHORT).show();
        }
    });
}

到目前为止一切正常,除了点击其中一个按钮时我没有收到祝酒信息。我没有看到任何错误 - 所以我做错了什么?

2 个答案:

答案 0 :(得分:1)

在android中,当嵌套的两个视图需要焦点或默认可点击时(ButtonImageButton)时,Android系统将/可能支持一个。对于你的情况,记住你有AdapterView(这种情况下它的GridView)的布局也是可点击的,这意味着那些Button所以它不知道你是否要点击行中的GridView或Button(如果你不知道在网格视图和列表视图的android行中,即使没有里面的按钮也是可点击的)。

所以会发生什么是Android系统不知道你要点击行或行内的Button。不幸的是,可点击的行为已经提供给Button,而不是您看似设置onItemClickListener的行无效。

因此,要解决您的问题,您必须选择以下备选方案:

1。删除按钮并将其替换为TextView。该行将是可点击的,因为TextView默认情况下不会像Button那样关注焦点。

2. 制作自定义行。应该通过xmlButton在其外部将行定义为独立视图,然后将其作为GridView的行进行充气。之后,将以下属性添加到视图的parent/root

    android:descendantFocusability="blocksDescendants"

这会阻止Button完全关注,因为Button将成为后代,并会被阻止。如果您不是如何连续创建多个视图的自定义GridView行,则可以使用任何教程this tutorial

3。最后但最简单的选择如果你真的喜欢你的布局并且你不想删除你的按钮onClickListener虽然很难得到View&# 39; s(Button&#39; s)使用这种方式的位置。我们在适配器的getView()方法中添加它。 以下是:

    public View getView(int position, View convertView, ViewGroup parent) {
    Button btn;
    if (convertView == null) {
        // if it's not recycled, initialize some attributes
        btn = new Button(mContext);
        btn.setLayoutParams(new GridView.LayoutParams(100, 85));
        btn.setPadding(8, 8, 8, 8);
    }
    else {
        btn = (Button) convertView;
    }                       

    btn.setText(filesnames[position]);
    // filenames is an array of strings
    btn.setTextColor(Color.WHITE);
    btn.setBackgroundResource(R.drawable.sample_0);
    btn.setId(position);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Button button=(Button)v;
            Toast.makeText(mContext, "You clicked "+button.getText().toString()+" with ID "+button.getId(), Toast.LENGTH_SHORT).show();
        }

    return btn;
}

答案 1 :(得分:0)

您是否尝试将点击侦听器直接放在适配器中的按钮上?

// create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        Button btn;
        if (convertView == null) {
            // if it's not recycled, initialize some attributes
            btn = new Button(mContext);
            btn.setLayoutParams(new GridView.LayoutParams(100, 85));
            btn.setPadding(8, 8, 8, 8);
        }
        else {
            btn = (Button) convertView;
        }                       

        btn.setText(filesnames[position]);
        // filenames is an array of strings
        btn.setTextColor(Color.WHITE);
        btn.setBackgroundResource(R.drawable.sample_0);
        btn.setId(position);

        //ADD THIS, to get context just getContext from the view.
        btn.setOnClickListener...

        return btn;
    }