2017-09-13 4 views
1

J'ai lu quelques messages et a constaté que reQuery() est obsolète et certains ont suggéré d'utiliser SwapCursor() ou ChangeCursor().Android: Comment actualiser CursorAdapter avec la prise en charge des anciennes API?

J'ai un bouton Favoris sur le clic duquel je mets à jour la base de données et change la couleur du bouton. Lorsque je défile et que je reviens à une vue particulière (et à un bouton), la couleur est réinitialisée. Je sais que c'est parce que la vue est recyclée. J'ai une condition basée sur une valeur de colonne DB pour définir la couleur du bouton.

Je veux voir les valeurs mises à jour de DB après avoir appuyé sur le bouton. Pour lequel je dois actualiser/requery Cursor/DB.

Comment faire cela avec CursorAdapter en gardant à l'esprit que mon min. API est 19?

MISE À JOUR Code CursorAdapter:

ToDoCursorAdapter public class étend CursorAdapter {

SparseBooleanArray selectionArrayAr = new SparseBooleanArray(); 
SparseBooleanArray selectionArrayRef = new SparseBooleanArray(); 
SparseBooleanArray selectionArrayFav = new SparseBooleanArray(); 
//Boolean isSet = false; 
private MainButtons_Interface mAdapterCallback; 


public ToDoCursorAdapter(Context context, Cursor cursor) { 
    super(context, cursor, 0); 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 

    ViewHolderItem viewHolder = new ViewHolderItem(); 
    View rowView = LayoutInflater.from(context).inflate(R.layout.listview, parent, false); 

    viewHolder.engTextV = (TextView) rowView.findViewById(R.id.engText); 

    viewHolder.arTextV = (TextView) rowView.findViewById(R.id.arabText); 
    viewHolder.buttonIAV = (Button) rowView.findViewById(R.id.buttonIA); //For Arabic Text 


    viewHolder.refTextV = (TextView) rowView.findViewById(R.id.refText); 
    viewHolder.buttonIRV = (Button) rowView.findViewById(R.id.buttonIR); //For Ref Text 

    viewHolder.buttonIFV = (ImageButton) rowView.findViewById(R.id.buttonF); 


    rowView.setTag(viewHolder); 
    return rowView; 
} 

@Override 
public void bindView(final View view, final Context context, final Cursor cursor) { 


    final ViewHolderItem viewHolder = (ViewHolderItem) view.getTag(); 

    String arabic = cursor.getString(cursor.getColumnIndexOrThrow("PlainArab_Text")).trim().replaceAll("[\n]{2,}", "TWOFEEDS").replaceAll("\n", " ").replaceAll(" +", " ").replaceAll("<br/>", "\n").replaceAll("TWOFEEDS", "\n") + "\n"; 
    String english = cursor.getString(cursor.getColumnIndexOrThrow("PlainEng_Text")).trim().replaceAll("[\n]{2,}", "TWOFEEDS").replaceAll("\n", " ").replaceAll(" +", " ").replaceAll("<br/>", "\n").replaceAll("TWOFEEDS", "\n") + "\n"; 
    String ref = cursor.getString(cursor.getColumnIndexOrThrow("REF")).trim().replaceAll("<br/> <br/>", " ").replaceAll("<br/>", "\n"); 

    final Integer HadithID = cursor.getInt(cursor.getColumnIndexOrThrow("ID")); 
    final Integer IsFav = cursor.getInt(cursor.getColumnIndexOrThrow("IsFavorite")); 

    viewHolder.arTextV.setText(arabic); 
    viewHolder.engTextV.setText(english); 
    viewHolder.refTextV.setText(ref); 

    final int position = cursor.getPosition(); 

    boolean isSelectedA = selectionArrayAr.get(position); 
    boolean isSelectedR = selectionArrayRef.get(position); 
    boolean isSelectedF = selectionArrayFav.get(position); 

    if (isSelectedA) { 
     viewHolder.arTextV.setVisibility(view.GONE); 
     viewHolder.buttonIAV.setText("Show Arabic Version"); 
    } else if (!isSelectedA){ 
     viewHolder.arTextV.setVisibility(view.VISIBLE); 
     viewHolder.buttonIAV.setText("Hide Arabic Version"); 
    } 

    if (isSelectedR) { 
     viewHolder.refTextV.setVisibility(view.GONE); 
     viewHolder.buttonIRV.setText("Show Refrence"); 
    } else if (!isSelectedR){ 
     viewHolder.refTextV.setVisibility(view.VISIBLE); 
     viewHolder.buttonIRV.setText("Hide Refrence"); 
    } 

    //boolean isSelectedF = selectionArrayFav.get(position); 
    if(isSelectedF) { 
     viewHolder.buttonIFV.setImageResource(R.drawable.favoritebutton_afterclick); 
    } else if (!isSelectedF){ 
     viewHolder.buttonIFV.setImageResource(R.drawable.favoritebutton); 
    } 


    //Arabic Button 
    viewHolder.buttonIAV.setOnClickListener(
      new View.OnClickListener() 
        { @Override 
         public void onClick(View v) { 
         boolean isSelectedAc = selectionArrayAr.get(position); 
          if(!isSelectedAc) { 
           viewHolder.arTextV.setVisibility(v.GONE); 
           viewHolder.buttonIAV.setText("Show Arabic Version"); 
           setSelectedAr(position, true); 
          } else if (isSelectedAc){ 
           viewHolder.arTextV.setVisibility(v.VISIBLE); 
           setSelectedAr(position, false); 
           viewHolder.buttonIAV.setText("Hide Arabic version"); 
          } 
         } 
        } 
    ); 

    //Ref Button 
    viewHolder.buttonIRV.setOnClickListener(
      new View.OnClickListener() 
      { @Override 
      public void onClick(View v) { 
       boolean isSelectedRc = selectionArrayRef.get(position); 
       if(!isSelectedRc) { 
        viewHolder.refTextV.setVisibility(v.GONE); 
        viewHolder.buttonIRV.setText("Show Reference"); 
        setSelectedRef(position, true); 
       } else if (isSelectedRc){ 
        viewHolder.refTextV.setVisibility(v.VISIBLE); 
        setSelectedRef(position, false); 
        viewHolder.buttonIRV.setText("Hide Reference"); 
       } 
      } 
      } 
    ); 


    //Fav Button 
    viewHolder.buttonIFV.setOnClickListener(
      new View.OnClickListener() 
      { @Override 
      public void onClick(View v) { 
       boolean isSelectedF = selectionArrayFav.get(position); 
       boolean IsSet = ((ListViewActivity) context).addRemFav(HadithID); 
       String mess =""; 

       if(IsSet){ 
        mess = "Hadith add to Favorite list"; 
       } else if(!IsSet){ 
        mess = "Hadith removed from Favorite list"; 
       } 

       if(!isSelectedF) { 
        viewHolder.buttonIFV.setImageResource(R.drawable.favoritebutton_afterclick); 
        setSelectedF(position, true); 

       } else if (isSelectedF){ 
        viewHolder.buttonIFV.setImageResource(R.drawable.favoritebutton); 
        setSelectedF(position, false); 
       } 

       Toast.makeText(v.getContext(), mess, Toast.LENGTH_SHORT).show(); 
      } 
      } 
    ); 
} 


// our ViewHolder. 
static class ViewHolderItem { 
    TextView engTextV; 
    TextView arTextV; 
    TextView refTextV; 

    Button buttonIAV; 
    Button buttonIRV; 
    ImageButton buttonIFV; 
} 

// Method to mark items in selection 
public void setSelectedAr(int position, boolean isSelected) { 
    selectionArrayAr.put(position, isSelected); 
} 

public void setSelectedRef(int position, boolean isSelected) { 
    selectionArrayRef.put(position, isSelected); 
} 
public void setSelectedF(int position, boolean isSelected) { 
    selectionArrayFav.put(position, isSelected); 
} 

MISE À JOUR

J'ajouté cette logique à ma fonction qui a été appelé en cliquant sur le bouton.

Cursor todoCursor1 = hadDB.rawQuery("SELECT ID as _id, * FROM HAD_TABLE WHERE ID < 7001 ", null); 
     todoAdapter.changeCursor(todoCursor1); 

Fondamentalement, il vous suffit de DB actualisez afin que vous obtenez des enregistrements mis à jour/données, puis changez votre curseur avec une nouvelle, todoCursor1 est mon cas ci-dessus.

De plus, changeCursor() va fermer votre curseur actuel, au cas où vous voudriez revenir à l'ancien curseur, vous devriez utiliser swapCursor() à la place car il vous renverra votre ancien curseur.

Maintenant, ma seule chose que je veux savoir est, si cela fonctionne pour les API 19 et plus.

+0

Pourriez-vous poster le code de l'adaptateur? Il serait beaucoup plus facile de le corriger directement – fillobotto

+0

@fillobotto Posté le code. –

+0

pourquoi ne pas utiliser 'SimpleCursorAdapter'? – pskink

Répondre

0

J'ai ajouté cette logique à ma fonction qui a été appelée en cliquant sur le bouton.

Cursor todoCursor1 = hadDB.rawQuery("SELECT ID as _id, * FROM HAD_TABLE WHERE ID < 7001 ", null); 
     todoAdapter.changeCursor(todoCursor1); 

Fondamentalement, il vous suffit de DB actualisez afin que vous obtenez des enregistrements mis à jour/données, puis changez votre curseur avec une nouvelle, todoCursor1 est mon cas ci-dessus.

De plus, changeCursor() va fermer votre curseur actuel, au cas où vous voudriez revenir à l'ancien curseur, vous devriez utiliser swapCursor() à la place car il vous renverra votre ancien curseur.