Клик Android GridView не обнаружен - PullRequest
7 голосов
/ 19 декабря 2011

У меня есть следующее LinearLayout с GridView в нем:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <GridView
        android:id="@+id/songs_grid"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true"
        android:columnWidth="250dp"
        android:gravity="center"
        android:horizontalSpacing="10dp"
        android:numColumns="auto_fit"
        android:verticalSpacing="10dp" />

</LinearLayout>

Данные GridView предоставляются настраиваемым адаптером (с использованием простого ViewHolder):

public class SongsAdapter extends BaseAdapter {

    private Context context;

    private LayoutInflater mInflater;

    private ArrayList<Song> songList;

    public SongsAdapter(Context context, ArrayList<Song> songList)
    {
        this.context = context;

        this.songList = songList;

        mInflater = LayoutInflater.from(this.context);
    }

    @Override
    public int getCount()
    {
        return songList.size();
    }

    public Object getItem(int position)
    {
        return songList.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        SongViewHolder viewHolder;

        if (convertView == null)
        {
            convertView = mInflater.inflate(R.layout.song_list_item, null);

            viewHolder = new SongViewHolder();

            //Get Views from Layout Template
            viewHolder.AlbumArt = (ImageView)convertView.findViewById(R.id.albumart);
            viewHolder.Title = (TextView)convertView.findViewById(R.id.title);
            viewHolder.Artist = (TextView)convertView.findViewById(R.id.artist);
        }
        else
        {
            viewHolder = (SongViewHolder) convertView.getTag();
        }

        Song song = songList.get(position);

        Bitmap bitmap = song.getAlbumArt();
        Bitmap missing = BitmapFactory.decodeResource(context.getResources(), R.drawable.albumart_missing);

        Bitmap albumArt = bitmap == null ? missing  : bitmap;

        viewHolder.AlbumArt.setImageBitmap(albumArt);
        viewHolder.Title.setText(song.getTitle());
        viewHolder.Artist.setText(song.getArtist());

        convertView.setTag(viewHolder);

        return convertView;
    }
}

Когда приложение запускается, оно получает список песен (из xml, но в настоящее время использует список, введенный вручную) и передает его в адаптер my, а затем устанавливает OnItemClickListener:

GridView gridView = (GridView) findViewById(R.id.songs_grid);
gridView.setAdapter(new SongsAdapter(this, fk.getSongList()));

gridView.setOnItemClickListener(new OnItemClickListener()
{
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
        LinearLayout layout = (LinearLayout)view;

        TextView songTitle = (TextView)layout.findViewById(R.id.song_title);

        Song song = fk.getSong((String) songTitle.getText());

        if(song != null)
        {
            Intent play = new Intent(getBaseContext(), Play.class);
            startActivity(play);
        }
    }
});

Когда я впервые реализовал этот код, все работало нормально, и я уверен, что ничего не изменил. Я пытался сделать текст для прокрутки названия песни шатерным способом, если он был слишком длинным, но не мог заставить его работать. На этом этапе я обнаружил, что щелчок перестал работать. Теперь я удалил (я верю) весь этот код, но он все еще не работает.

Когда я касаюсь / щелкаю (как вы это называете), ничего не происходит. без ошибок ничего.

Что-то не так с моим кодом, что может вызвать эту проблему?

Ответы [ 5 ]

35 голосов
/ 19 декабря 2011

Проверьте ваш макет элемента.Если какой-либо из видов компоновки song_list_item помечен как кликабельный, он блокирует ответную реакцию слушателя сетки.

6 голосов
/ 19 декабря 2011

Убедитесь, что атрибут clickable в GridView не переопределяет события щелчка для элементов в представлении.

1 голос
/ 22 мая 2016

, если вы сделаете все изображения и текстовое представление android: focusable = "false" android: focusableInTouchMode = "false"

Не будет никаких проблем в элементе gridview, нажмите слушатель

1 голос
/ 24 февраля 2015

Добавьте это в свою ячейку xml

android:descendantFocusability="blocksDescendants"
1 голос
/ 28 марта 2013

Я столкнулся с этой проблемой, и решение похоже на ответ dmon.Если один из дочерних элементов элемента доступен для выбора, он также предотвращает щелчок элемента.Так что если android:textIsSelectable верно.

...