2011-09-26 3 views
0

J'ai struggeling au cours des derniers jours en essayant de comprendre cela, je l'espère, vous pouvez me aider ...Android ViewHolder en CursorAdapter provoquant listView à se faire défoncer

j'ai une activité qui affiche une liste de les joueurs en définissant un listadapter comme ceci:

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

Lorsque vous cliquez sur un élément dans la liste, ce code sera exécuté montrant une boîte de dialogue avec un « Edition » et l'option « Supprimer » pour l'édition et la suppression joueurs:

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(); 
     } 

Sur la base de votre choix (Modifier ou supprimer joueur), l'auditeur suivant sera exécuté:

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(); 

     } 
    } 
} 

Le code de l'adaptateur est ici:

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); 
    } 
} 

Maintenant, le problème est que, après la suppression quelques-uns des joueurs dans la liste, la liste se fout, par exemple. cela montre quelque chose de différent de ce qui est réellement disponible. J'ai expérimenté un peu et si j'arrête d'utiliser le PlayerViewHolder dans bindView et à la place lire le texte à partir du curseur et l'assigner directement aux champs de texte, alors ça marche .... Donc la question est, pourquoi est mon ViewHolder foutant les choses ???

Toute aide sera grandement appréciée!

Merci!

  • Zyb3r

Répondre

0

trouvé une solution ...

Fondamentalement, je REINITIALIZE le curseur et ListAdapter ainsi que attribue le ListAdapter au ListView tout recommencer quand je change les données dans la base de données. Je ne suis pas tout à fait sûr pourquoi c'est nessasary, mais notifyDataSetChanged(), notifyDataSetInvalidated() et toutes les autres choses que j'ai essayées n'ont pas fonctionné, alors maintenant j'utilise cette approche. : O)

  • Zyb3r
+0

Qu'en est 'Cursor.requery() ''? –

Questions connexes