Java android中GridView中未激发OnItemClick事件

Java android中GridView中未激发OnItemClick事件,java,android,android-layout,android-widget,Java,Android,Android Layout,Android Widget,我正在开发一个应用程序,其中gridview包含按钮列表 当我在gridview中放置图像而不是按钮时,事件被触发。但是如果我在gridview中放置按钮,然后单击事件未被调用…我不知道问题出在哪里…即使我没有得到异常 这是我的密码 public class MainMenu extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle save

我正在开发一个应用程序,其中gridview包含按钮列表

当我在gridview中放置图像而不是按钮时,事件被触发。但是如果我在gridview中放置按钮,然后单击事件未被调用…我不知道问题出在哪里…即使我没有得到异常

这是我的密码

public class MainMenu extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);



    GridView gridview = (GridView) findViewById(R.id.mainMenu);
    gridview.setAdapter(new ImageAdapter(this));

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



}
//inner class for adapter

class ImageAdapter extends BaseAdapter {
    private Context mContext;

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

    public int getCount() {
        return mThumbIds.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) {
        //ImageView imageView;
        Button btn;

        if (convertView == null) {  // if it's not recycled, initialize some attributes

            btn=new Button(mContext);
       //   imageView = new ImageView(mContext);

            btn.setLayoutParams(new GridView.LayoutParams(120,120));
        //  imageView.setLayoutParams(new GridView.LayoutParams(140,140));


            //imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
            btn.setPadding(10,15, 10,15);
            btn.setImeActionLabel("hello",0);// actionId)

        //  imageView.setPadding(8,8, 8, 8);

        } else 
        {
            btn=(Button)convertView;
            //imageView=(ImageView)convertView;
        }
        btn.setBackgroundResource(mThumbIds[position]);
        //imageView.setImageResource(mThumbIds[position]);
        //return imageView;
        return btn;
    }

    // references to our images
    private Integer[] mThumbIds = 
    {
            R.drawable.pantrylocator_icon,
            R.drawable.volunteeropportunity_icon,
            R.drawable.volunteerlocator_icon,
            R.drawable.volunteermanagement_icon,
            R.drawable.donationform_icon,
            R.drawable.donationviamsg_icon,
            R.drawable.donationvideo_icon,
            R.drawable.virtualfooddrive_icon,
            R.drawable.newevent_icon,
            R.drawable.pressrelease_icon,
            R.drawable.volunteerphotos_icon,
            R.drawable.aboutus_icon,

     };
}
}
public类主菜单扩展活动
{
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView GridView=(GridView)findViewById(R.id.main菜单);
setAdapter(新的ImageAdapter(this));
setOnItemClickListener(新的OnItemClickListener()
{
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
Toast.makeText(main menu.this,“hello”+位置,Toast.LENGTH_SHORT.show();
}
});
}
//适配器的内部类
类ImageAdapter扩展BaseAdapter{
私有上下文;
公共图像适配器(上下文c)
{
mContext=c;
}
public int getCount(){
返回mThumbIds.length;
}
公共对象getItem(int位置){
返回null;
}
公共长getItemId(int位置){
返回0;
}
//为适配器引用的每个项目创建新的ImageView
公共视图getView(int位置、视图转换视图、视图组父视图){
//图像视图图像视图;
按钮btn;
如果(convertView==null){//如果它没有被回收,初始化一些属性
btn=新按钮(mContext);
//imageView=新的imageView(mContext);
btn.setLayoutParams(新的GridView.LayoutParams(120120));
//setLayoutParams(新的GridView.LayoutParams(140140));
//imageView.setScaleType(imageView.ScaleType.FIT_CENTER);
btn.设置填充(10,15,10,15);
btn.setImeActionLabel(“hello”,0);//actionId)
//设置填充(8,8,8,8);
}否则
{
btn=(按钮)转换视图;
//imageView=(imageView)convertView;
}
btn.挫折资源(mThumbIds[职位]);
//setImageResource(mThumbIds[position]);
//返回图像视图;
返回btn;
}
//参考我们的图像
私有整数[]mThumbIds=
{
R.drawable.pantrylocator_图标,
R.drawable.u图标,
R.drawable.Locator_图标,
R.drawable.u图标,
R.drawable.donationform_图标,
R.drawable.donationviamsg_图标,
R.drawable.donationvideo_图标,
R.drawable.VirtualFoodAddress\u图标,
R.drawable.newevent_图标,
R.drawable.按Release_图标,
R.drawable.u图标,
R.drawable.aboutus_图标,
};
}
}
gridview=(gridview)findViewById(R.id.gameGrid);
setAdapter(ia);
setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
//你的代码在这里
}
为添加在
gridView

gridView=(gridView)findViewById(R.id.gameGrid)中的按钮添加单击事件;
setAdapter(ia);
setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
//你的代码在这里
}

为在gridView中添加的按钮添加单击事件没有为正在添加的按钮编写onclick事件。请为按钮编写代码以处理单击事件!然后告知我们。

没有为正在添加的按钮编写onclick事件。为按钮编写代码以处理单击事件!告知我们嗯。

该按钮有自己的OnClick侦听器:

 public View getView(int position, View convertView, ViewGroup parent) {
        //ImageView imageView;
        Button btn;

        if (convertView == null) {  // if it's not recycled, initialize some attributes

            btn=new Button(mContext);
            btn.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    // Perform action on click
                 }
             });
       //   imageView = new ImageView(mContext);

            btn.setLayoutParams(new GridView.LayoutParams(120,120));
        //  imageView.setLayoutParams(new GridView.LayoutParams(140,140));


            //imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
            btn.setPadding(10,15, 10,15);
            btn.setImeActionLabel("hello",0);// actionId)

        //  imageView.setPadding(8,8, 8, 8);

        } else 
        {
            btn=(Button)convertView;
            //imageView=(ImageView)convertView;
        }
        btn.setBackgroundResource(mThumbIds[position]);
        //imageView.setImageResource(mThumbIds[position]);
        //return imageView;
        return btn;
    }

该按钮有自己的OnClickListener:

 public View getView(int position, View convertView, ViewGroup parent) {
        //ImageView imageView;
        Button btn;

        if (convertView == null) {  // if it's not recycled, initialize some attributes

            btn=new Button(mContext);
            btn.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    // Perform action on click
                 }
             });
       //   imageView = new ImageView(mContext);

            btn.setLayoutParams(new GridView.LayoutParams(120,120));
        //  imageView.setLayoutParams(new GridView.LayoutParams(140,140));


            //imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
            btn.setPadding(10,15, 10,15);
            btn.setImeActionLabel("hello",0);// actionId)

        //  imageView.setPadding(8,8, 8, 8);

        } else 
        {
            btn=(Button)convertView;
            //imageView=(ImageView)convertView;
        }
        btn.setBackgroundResource(mThumbIds[position]);
        //imageView.setImageResource(mThumbIds[position]);
        //return imageView;
        return btn;
    }

当我在基本adpter类中定义按钮单击事件时,我已经解决了我的问题,并且我的问题已经解决了……

当我在基本adpter类中定义按钮单击事件时,我已经解决了我的问题,并且我的问题已经解决了……

我也解决了这个问题,但最终得到了解决方案,我遵循了上述建议

并在基本适配器类中定义按钮单击事件,如

公共视图getView(最终整数位置、视图转换视图、视图组父视图){ //TODO自动生成的方法存根

        View v;

        if(convertView==null){

            LayoutInflater li = LayoutInflater.from(mContext);

            v = li.inflate(R.layout.icon, null);

             tv = (Button)v.findViewById(R.id.icon_text);

             iv = (ImageView)v.findViewById(R.id.icon_image);

            iv.setImageResource(mThumbIds[position]);


tv.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

    Toast.makeText(mContext, "vim", Toast.LENGTH_LONG).show();

}

});

        }

        else

        {
            v = (View)convertView;
        }

        return v;
    }

我也有这个问题,但最终得到了解决我已经按照上述建议

并在基本适配器类中定义按钮单击事件,如

公共视图getView(最终整数位置、视图转换视图、视图组父视图){ //TODO自动生成的方法存根

        View v;

        if(convertView==null){

            LayoutInflater li = LayoutInflater.from(mContext);

            v = li.inflate(R.layout.icon, null);

             tv = (Button)v.findViewById(R.id.icon_text);

             iv = (ImageView)v.findViewById(R.id.icon_image);

            iv.setImageResource(mThumbIds[position]);


tv.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

    Toast.makeText(mContext, "vim", Toast.LENGTH_LONG).show();

}

});

        }

        else

        {
            v = (View)convertView;
        }

        return v;
    }

在ImageAdapter->getView方法中,在返回新创建的“convertView”之前添加以下行


如果gridview中的任何视图是可单击的,则它们将阻止网格的ItemClick侦听器响应。

在ImageAdapter->getView方法中,在返回新创建的“convertView”之前添加以下行


如果gridview中的任何视图都是可单击的,那么它们将阻止网格的ItemClick侦听器响应。

最干净的方法是:从每个按钮的click侦听器中调用gridview上的performItemClick()。这样,您仍然可以像正常情况一样使用gridview的OnItemClick侦听器

@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {

    ...

    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            ((GridView) parent).performItemClick(v, position, 0);
        }
    });
}

最干净的方法是:从每个按钮的click listener中调用GridView上的performItemClick()。这样,您仍然可以像正常情况一样使用GridView的OnItemClick listener

@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {

    ...

    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            ((GridView) parent).performItemClick(v, position, 0);
        }
    });
}

这只是一个假设,但可能是因为按钮有自己的OnClickListener。我想我对GridView也有类似的问题。