GridView OnItemClickListener никогда не вызывается

#java #android #android-gridview

#java — язык #Android #android-gridview #java

Вопрос:

У меня есть GridView с пользовательским View в нем, который является Button и TextView . Я определил 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");
    }
});
  

Ответ №1:

Отмеченный ответ является своего рода взломом. Вместо установки onclicklistener для кнопки просто убедитесь, что ButtonView и TextView имеют следующее свойство:

 android:clickable="false"
  

Комментарии:

1. это было решение. Спасибо

2. а также android:focusable=»false»

3. простой и наилучший ответ.

Ответ №2:

У меня была такая же проблема. Хотя я еще не понял, почему он никогда не вызывается, я могу предложить обходной путь.

Вместо того, чтобы устанавливать OnClickListener в вашем GridView, установите его на самой кнопке внутри вашего GridAdapter, внутри вашего метода getView().

У меня это сработало!

Комментарии:

1. Да, это сработало, но почему не работает touch on grid view, эта проблема не связана с listview, почему grid view

Ответ №3:

Возможно, некоторые элементы в вашем GridView отвлекают внимание. Попробуйте добавить эти атрибуты к любым элементам, которые у вас есть внутри сетки:

 android:focusable="false"
android:focusableInTouchMode="false"
  

Ответ №4:

Вместо того, чтобы устанавливать onClickListener на вашем GridView ,
установите его на Button себе внутри вашего GridAdapter , внутри вашего getView() метода.

У меня это сработало!

Ответ №5:

У меня была та же проблема, событие grid.itemClickListener так и не было запущено.

В моем случае у меня было два слушателя: grid.itemClickListener и еще один clickListener , прикрепленный к Button в макете элемента.

Повозившись некоторое время с макетом, я понял, что если в макете элемента был виджет с focusable=true , то itemClickListener он никогда не запускался. clickListener Прикрепленный к Button , тем не менее, работал хорошо.

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

Ответ №6:

Спасибо 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;
}
  

Ответ №7:

Вы можете установить OnClick для просмотра в адаптере GridView .У меня это работает.

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