OnItemClickEvent не запускается в GridView в Android

1

i m разрабатывает приложение, в котором gridview содержит список кнопок...

когда я помещаю изображения вместо кнопки в gridview, тогда onItemClickEvent запускается... но если я помещаю кнопку в 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 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,

     };
}
}
  • 0
    Просто предположение, но, возможно, потому, что кнопка имеет свой собственный OnClickListener.
  • 0
    Я думаю, что у меня была похожая проблема с GridView. Мои элементы не содержали кнопок, но я объявил их «кликабельными» в layout.xml. Удаление «кликабельных» исправило ситуацию для меня - но опять же - я не использовал кнопки.
Показать ещё 1 комментарий
Теги:
android-layout
android-widget

7 ответов

6
Лучший ответ

Кнопка имеет свой собственный OnClickListener:

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

        if (convertView == null) {  // if it 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;
    }
3

В вашем методе ImageAdapter- > getView добавьте следующую строку перед возвратом вновь созданного "convertView"

            convertView.setClickable(false);
            convertView.setFocusable(false);

Если какое-либо из видов в gridview является кликабельным, то они будут блокировать прослушиватель ItemClick сетки.

2

У меня тоже есть эта проблема, но, наконец, я получил решение, которое я следую приведенной выше рекомендации

и определить событие нажатия кнопки в классе базового адаптера, например

public Просмотреть getView (конечная позиция int, View convertView, родительская группа ViewGroup) {           //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;
    }
2

Нет события onclick, записанного для кнопок, которые вы добавляете. Напишите код для кнопок для обработки события click! дайте нам знать.

  • 0
    эй, приятель ... я решил проблему ... я просто определяю событие нажатия кнопки в базовом классе адаптера ... и моя проблема решена ........
1
    gridview = (GridView) findViewById(R.id.gameGrid);
        gridview.setAdapter(ia);            
        gridview.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //Ur Code here
                 }

Добавить события click для кнопки, добавленной в gridView

  • 0
    эй, приятель ... я решил проблему ... я просто определяю событие нажатия кнопки в базовом классе адаптера ... и моя проблема решена ........
  • 0
    @Nirav: Coool .. :)
0

Здесь самый чистый способ сделать это: вызовите функцию performItemClick() в GridView изнутри каждого нажатия кнопки. Таким образом, вы все равно можете использовать GridView onItemClickListener, как обычно.

@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);
        }
    });
}

http://www.migapro.com/click-events-listview-gridview/

-3

Я решил свою проблему, поскольку я определяю событие нажатия кнопки в базовом классе adpter, и моя проблема решена......

  • 0
    Пожалуйста, напишите комментарии ниже ответы других, а не как отдельные ответы .. не имеет никакого смысла.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню