2011-09-26 88 views
0

我一直在struggeling過去幾天試圖弄清楚這一點,我希望你能幫助我...的Android ViewHolder中的CursorAdapter造成的ListView得到擰

我有一個顯示列表的活動

PlayerCursorAdapter playerAdapter = new PlayerCursorAdapter(this, 
             R.layout.players_row, c, columns, to); 
setListAdapter(playerAdapter); 

單擊列表中的項目時,該代碼就會被執行示出了具有「編輯」對話框和「刪除」選項用於編輯和刪除玩家:

通過設置這樣的listadapter玩家
private class OnPlayerItemClickListener implements OnItemClickListener { 
     public void onItemClick(AdapterView<?> parent, View view, int position, 
       long rowId) { 
      Toast.makeText(view.getContext(), 
        "Clicked Item [" + position + "], rowId [" + rowId + "]", 
        Toast.LENGTH_SHORT).show(); 

      // Prepare Dialog with "Edit" and "Delete" option 
      final CharSequence[] choices = { 
        view.getContext().getString(R.string.buttonEdit), 
        view.getContext().getString(R.string.buttonDelete) }; 

      AlertDialog.Builder builder = new AlertDialog.Builder(
        view.getContext()); 
      builder.setTitle(R.string.title_edit_delete_player); 
      builder.setItems(choices, new EditOrDeleteDialogOnClickListener(
        view, rowId)); 

      AlertDialog alert = builder.create(); 

      // Show Dialog 
      alert.show(); 
     } 

根據您的選擇(編輯或刪除播放器),下面的聽衆將被執行:

private class EditOrDeleteDialogOnClickListener implements 
     DialogInterface.OnClickListener { 

    private View view; 
    private long rowId; 

    public EditOrDeleteDialogOnClickListener(View view, long rowId) { 
     this.view = view; 
     this.rowId = rowId; 
    } 

    public void onClick(DialogInterface dialog, int item) { 
     if (item == 0) { 
      // Edit 
      showDialog(PlayGameActivity.DIALOG_EDIT_PLAYER_ID); 
     } else if (item == 1) { 
      // Delete from database 
      DatabaseHelper databaseHelper = new DatabaseHelper(
        view.getContext()); 
      databaseHelper.deletePlayer(rowId); 

      // Requery to update view. 
      ((PlayerCursorAdapter) getListAdapter()).getCursor().requery(); 

      Toast.makeText(
        view.getContext(), 
        view.getContext().getString(
          R.string.message_player_removed) 
          + " " + rowId, Toast.LENGTH_SHORT).show(); 

     } 
    } 
} 

適配器的代碼是在這裏:

public class PlayerCursorAdapter extends SimpleCursorAdapter { 

    private LayoutInflater layoutInflater; 
    private int layout; 

    public PlayerCursorAdapter(Context context, 
      int layout, Cursor c, String[] from, int[] to) { 
     super(context, layout, c, from, to); 
     this.layout = layout; 
     layoutInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     Cursor c = getCursor(); 
     View view = layoutInflater.inflate(layout, parent, false); 

     // Get Data 
     int nameCol = c.getColumnIndex(Player.COLUMN_PLAYER_NAME); 
     String name = c.getString(nameCol); 
     int gamesPlayedCol = c.getColumnIndex(Player.COLUMN_GAMES_PLAYED); 
     String gamesPlayed = c.getString(gamesPlayedCol); 
     int gamesWonCol = c.getColumnIndex(Player.COLUMN_GAMES_WON); 
     String gamesWon = c.getString(gamesWonCol); 

     // Set data on fields 
     TextView topText = (TextView) view.findViewById(R.id.topText); 
     if (name != null) 
      topText.setText(name); 

     TextView bottomText = (TextView) view.findViewById(R.id.bottomText); 
     if (gamesPlayed != null && gamesWon != null) 
      bottomText.setText(view.getContext().getString(
        R.string.info_played_won) 
        + gamesPlayed + "/" + gamesWon); 

     CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox); 

     // Set up PlayerViewHolder 
     PlayerViewHolder playerViewHolder = new PlayerViewHolder(); 
     playerViewHolder.playerName = name; 
     playerViewHolder.gamesPlayed = gamesPlayed; 
     playerViewHolder.gamesWon = gamesWon; 
     playerViewHolder.isChecked = checkBox.isChecked(); 
     view.setTag(playerViewHolder); 
     return view; 
    } 

    private class PlayerViewHolder { 
     String playerName; 
     String gamesPlayed; 
     String gamesWon; 
     boolean isChecked; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor c) { 
     PlayerViewHolder playerViewHolder = (PlayerViewHolder) view.getTag(); 

     TextView topText = (TextView) view.findViewById(R.id.topText); 
     topText.setText(playerViewHolder.playerName); 

     TextView bottomText = (TextView) view.findViewById(R.id.bottomText); 
     bottomText.setText(view.getContext() 
       .getString(R.string.info_played_won) 
       + playerViewHolder.gamesPlayed 
       + "/" 
       + playerViewHolder.gamesWon); 

     CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox); 
     checkBox.setChecked(playerViewHolder.isChecked); 
    } 
} 

現在的問題是,取消之後列表中的一些球員,名單被搞砸了,例如。它顯示的內容與實際可用的內容不同。

我已經試驗了一點,如果我停止在bindView中使用PlayerViewHolder,而是從光標讀取文本並將其直接分配給文本字段,那麼它的工作....所以問題是,爲什麼我的ViewHolder搞砸了東西?

任何幫助將不勝感激!

謝謝!

  • Zyb3r

回答

0

找到了解決辦法...

基本上我重新初始化光標,當我改變數據庫中的數據ListAdapter加一遍分配ListAdapter到ListView。我不完全確定爲什麼這是nessasary,但notifyDataSetChanged(),notifyDataSetInvalidated()和我嘗試過的所有其他事情都不起作用,所以現在我正在使用這種方法。 :O)

  • Zyb3r
+0

和怎麼樣'Cursor.requery()''? –

相關問題