我正在构建一个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);
非常感谢任何帮助。
由于
答案 0 :(得分:5)
问题是当convertView == null时你没有把数据放到视图中, 您只需设置如何找到它们。
您需要做的是从&#34; else&#34; part,实际更改视图的代码,并将其放在整个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;
}
答案 1 :(得分:0)
致电:
adapter.notifyDataSetChanged()
当您的列表包含新数据时
答案 2 :(得分:0)
您好朋友可以使用水平或垂直滚动视图来解决此问题,因为您知道每次都会回收列表视图。
我之前也遇到过这个问题,而不是使用滚动来比较listview
然后创建一个布尔数组列表,作为列表项的大小 并首先设置所有值false。之后你可以使用你的代码
@Override
public void onClick(View v) {
if (((CheckBox)v).isChecked()) {
checkBoxState[position] = true;
}
else {
checkBoxState[position] = false;
}
}
});