2013-02-15 35 views
2

我正在構建一個Android應用程序,並且作爲它的一部分,我正在顯示帶複選框的歌曲列表以供選擇。我正在使用自定義列表適配器來執行此操作。代碼似乎加載並與複選框一起工作,但唯一的問題是,只有列表視圖中的最頂層項才顯示文本,直到我向下滾動列表,然後其他項呈現文本。僅限Android ListView顯示滾動後的項目

我知道這可能是一個問題,而不是刷新或類似的東西,但我不知道如何解決它。

繼承人爲我的適配器代碼:

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

的getView方法是造成這一點,我不知道爲什麼在那一刻,但我有同樣的問題,它是由Android元素的可重複使用的設計造成的。 – Nickolaus 2013-02-15 12:00:26

回答

5

的問題是,你不把數據放入意見時convertView == NULL, 只設置瞭如何找到他們。

您需要做的是從「其他」部分刪除實際更改視圖的代碼,並將其放在整個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; 
} 
以各種方式
+0

無效()你的看法謝謝你的幫助,對我來說是多麼愚蠢的事情! – peppermcknight 2013-02-15 12:12:54

+1

是的,如果你願意,你也可以通過谷歌觀看「listView世界」的演講。我認爲它可以幫助很多對listView不熟悉的人。 – 2013-02-15 12:13:43

0

電話:

adapter.notifyDataSetChanged() 

當你的列表中包含的新數據

+0

right,或者notifyDataSetChanged()沒有在正確的時機調用 – Nickolaus 2013-02-15 12:02:36

+0

感謝您的建議,嘗試在設置適配器後添加該行,但沒有幫助解決問題。 – peppermcknight 2013-02-15 12:06:32

+0

嘗試在你的「notifyDataSetChanged」 – 2013-02-15 12:09:38

0

喜的朋友,你可以使用水平或垂直滾動​​視圖中刪除這個問題,因爲你知道,列表視圖是每次都回收。

比之前我使用滾動相比的ListView

然後創建一個ArrayList的布爾作爲您的列表項 的大小,並設置所有值false第一,我也面臨這個問題。之後ü可以使用你的代碼

  @Override 
      public void onClick(View v) { 
       if (((CheckBox)v).isChecked()) { 
        checkBoxState[position] = true; 
       } 
       else { 
        checkBoxState[position] = false; 
       } 
      } 
     }); 
相關問題