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

こんにちは友人、リストビューが毎回リサイクルされることを知っているので、水平または垂直スクロールビューを使用してこの問題を取り除くことができます。

リストビューと比較してスクロールを使用する前に、私もこの問題に直面しています

次に、リストアイテムのサイズとしてのブール配列リストを作成し、最初にすべての値をfalseに設定します。その後、あなたはあなたのコードを使うことができます

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

電話:

adapter.notifyDataSetChanged() 

リストに新しいデータが含まれている場合

于 2013-02-15T12:01:08.003 に答える