2017-09-13 8 views
1

私はいくつかの記事を読んで、reQuery()は非難されており、いくつかはSwapCursor()またはChangeCursor()を使って示唆されています。Android:古いAPIをサポートするためにCursorAdapterを更新するには?

ボタンをクリックしてDBを更新し、ボタンの色を変更するお気に入りのボタンがあります。スクロールして特定のビュー(およびボタン)に戻ると、カラーがリセットされます。 ビューがリサイクルされているためです。 DBの列の値に基づいて、ボタンの色を設定する条件があります。

私はボタンを押した後、DBから更新された値を取得します。そのために私はCursor/DBをリフレッシュ/クエリーする必要があります。

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

は基本的に、あなたはちょうどあなたが更新されたレコード/データを取得し、新しいものとあなたの現在のカーソルを変更するようにDBを再クエリする必要があり、todoCursor1は、上記の私の場合です。

また、changeCursor()は現在のカーソルを閉じます。古いカーソルに戻る場合は、代わりにswapCursor()を使用してください。古いカーソルが返されるためです。

ここで私が知りたいのは、これがAPI 19以上で機能するかどうかだけです。

+0

アダプターのコードを投稿できますか?直接修正する方がはるかに簡単です – fillobotto

+0

@fillobottoコードを投稿しました。 –

+0

なぜあなたは 'SimpleCursorAdapter'を使っていませんか? – pskink

答えて

0

ボタンをクリックして呼び出された私の機能にこのロジックを追加しました。

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

は基本的に、あなたはちょうどあなたが更新されたレコード/データを取得し、新しいものとあなたの現在のカーソルを変更するようにDBを再クエリする必要があり、todoCursor1は、上記の私の場合です。

また、changeCursor()は現在のカーソルを閉じます。古いカーソルに戻る場合は、代わりにswapCursor()を使用してください。古いカーソルが返されるためです。

関連する問題