3

我正在构建一个 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);

任何帮助将不胜感激。

谢谢

4

3 回答 3

5

问题是您没有在 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;
}
于 2013-02-15T12:09:59.843 回答
0

称呼:

adapter.notifyDataSetChanged() 

当您的列表包含新数据时

于 2013-02-15T12:01:08.003 回答
0

嗨朋友,您可以使用水平或垂直滚动​​视图来解决这个问题,因为您知道列表视图每次都会被回收。

与 listview 相比,我在使用滚动之前也遇到过这个问题

然后创建一个布尔数组列表作为列表项的大小,并首先将所有值设置为 false。之后你可以使用你的代码

           @Override
            public void onClick(View v) {
                if (((CheckBox)v).isChecked()) {
                    checkBoxState[position] = true;
                }
                else {
                    checkBoxState[position] = false;
                }
            }
        });
于 2013-02-15T12:04:25.400 回答