Android:如何刷新CursorAdapter并支持旧版API?

时间:2017-09-13 10:46:37

标签: android android-cursoradapter

我阅读了一些帖子,发现reQuery()已被弃用,有些建议使用SwapCursor()ChangeCursor()

我有一个收藏夹按钮,点击它更新数据库并更改按钮的颜色。当我滚动并返回特定视图(和按钮)时,颜色被重置。 我知道这是因为视图被回收了。我有一个基于DB列值的条件来设置Button的颜色。

我希望view在按下按钮后从DB获取更新值。我必须刷新/重新查询Cursor / DB。

如何使用CursorAdapter记住我的分钟。 API是19?

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

更新

我将此逻辑添加到我的函数中,该函数在单击Button时被调用。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我将此逻辑添加到我的函数中,该函数在单击Button时被调用。

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

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

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