Android ListView показывает только элементы после прокрутки

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

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

Вот код для моего адаптера:

private class PlaylistDetailsAdapter extends ArrayAdapter<Song> {

    boolean[] checkBoxState;
    ViewHolder viewHolder;

    public PlaylistDetailsAdapter(Context context, int textViewResourceId, ArrayList<Song> songs) {
        super(context, textViewResourceId, songs);
        checkBoxState = new boolean[songs.size()];
    }

    private class ViewHolder {
        TextView songName;
        CheckBox checkBox;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.activity_playlist_details_row, null);
            viewHolder = new ViewHolder();

            viewHolder.songName = (TextView)convertView.findViewById(R.id.playlist_details_song_name);
            viewHolder.checkBox = (CheckBox)convertView.findViewById(R.id.playlist_details_checkbox);
            convertView.setTag(viewHolder);
        }
        else {
            viewHolder = (ViewHolder)convertView.getTag();
            Song song = playlistSongs.get(position);
            viewHolder.songName.setText(song.getTitle() + " - " + song.getArtist());
            viewHolder.checkBox.setChecked(checkBoxState[position]);
            viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (((CheckBox)v).isChecked()) {
                        checkBoxState[position] = true;
                    }
                    else {
                        checkBoxState[position] = false;
                    }
                }
            });

        }

        return convertView;
    }

}

Это код для настройки представления списка:

playlistSongs = db.getPlaylistTracks(getIntent().getLongExtra("id", 0));

    TextView playlistName = (TextView)findViewById(R.id.playlist_details_name);
    playlistName.setText(getIntent().getStringExtra("name"));

    final PlaylistDetailsAdapter adapter = new PlaylistDetailsAdapter(this, R.layout.activity_playlist_details_row, playlistSongs);

    ListView playlistSongList = (ListView)findViewById(R.id.listview_playlist_details);

    playlistSongList.setAdapter(adapter);

Любая помощь будет принята с благодарностью.

Спасибо

3 ответа

Решение

Проблема в том, что вы не помещаете данные в представления, когда convertView==null, вы только указываете, как их найти.

Что вам нужно сделать, это удалить из части "else" код, который фактически изменяет представления, и поместить его сразу после всей области if-else.

пример:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
     ...
    }
    else 
        viewHolder = (ViewHolder)convertView.getTag();
    // now we have the views ready to be changed , so change them :
    Song song = playlistSongs.get(position);
    ...
    return convertView;
}

Вызов:

adapter.notifyDataSetChanged() 

когда ваш список содержит новые данные

Привет, друг, вы можете использовать горизонтальную или вертикальную прокрутку, чтобы устранить эту проблему, поскольку вы знаете, что просмотр списка происходит каждый раз.

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

затем создайте логический массив arrayList размером с ваш элемент списка и сначала установите все значение false. после этого вы можете использовать свой код

           @Override
            public void onClick(View v) {
                if (((CheckBox)v).isChecked()) {
                    checkBoxState[position] = true;
                }
                else {
                    checkBoxState[position] = false;
                }
            }
        });
Другие вопросы по тегам