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