Android:如何刷新CursorAdapter以支持较旧的API?

问题描述:

我看了一些帖子,发现reQuery()已被弃用,有人建议使用SwapCursor()ChangeCursor()Android:如何刷新CursorAdapter以支持较旧的API?

我有一个最喜爱的按钮,在其上单击我更新数据库并更改按钮的颜色。当我滚动并回到特定的视图(和按钮)时,颜色被重置。 我知道这是因为视图被回收。我有一个基于DB列值的条件来设置Button的颜色。

我想查看从数据库中获取更新的值后,我按下按钮。为此我必须刷新/重新查询光标/数据库。

我该如何做到这一点与CursorAdapter牢记我的最低。 API是19?

UPDATE 的CursorAdapter代码:

公共类ToDoCursorAdapter扩展的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); 
} 

UPDATE

我加入这个逻辑我的函数被调用上单击按钮。

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

基本上,你只需要重新查询数据库,以便您获得更新记录/数据,然后改变你的当前光标用一个新的,todoCursor1高于我的情况。

此外,changeCursor()将关闭您当前的光标,如果您想要返回到旧光标,您应该使用swapCursor(),因为它会返回您旧的光标。

现在我唯一想知道的是,如果这将适用于API 19和更高版本。

+0

你能发布适配器的代码吗?直接修正它会容易得多 – fillobotto

+0

@fillobotto发布了代码。 –

+0

为什么不使用'SimpleCursorAdapter'? – pskink

我将这个逻辑添加到我点击按钮时调用的函数中。

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

基本上,你只需要重新查询数据库,以便您获得更新记录/数据,然后改变你的当前光标用一个新的,todoCursor1高于我的情况。

此外,changeCursor()将关闭您当前的光标,如果您想要返回到旧光标,您应该使用swapCursor(),因为它会返回您旧的光标。