永远不会调用GridView onItemClickListener

时间:2011-05-12 18:16:11

标签: java android android-gridview

我有GridView个自定义View,其中包含ButtonTextView。我定义了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");
    }
});

7 个答案:

答案 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;
}