1

Androidにはカスタムアダプターがあります。このカスタムアダプターでは、テキストとテキストを削除するボタンを含むビューを作成します。これはすべて正常に機能し、データベースからレコードを削除できますが、リストを更新できませんでした。

リストは次のようになります。

------------------------------------
text text text text | Delete Button|
------------------------------------
text text text text | Delete Button|
------------------------------------

私の最初の本能は、次のようなものを使用することでした:

QCListFragment frag = (QCListFragment) getSupportFragmentManager().findFragmentById(R.id.listFragment);

どの時点で、リストフラグメント内のメソッドを呼び出してリストを再クエリできます...しかし、アダプターがフラグメントを拡張しないため、これを行うことはできません。そのため、データが変更されたことをフラグメントに知らせるのは難しいと感じています。

とにかく、私の最後の考えはアクティビティを再構築することだけでしたが、それはおそらく最善の方法ではなく、より良い方法が必要だと思いました...私が見逃しているのは単純なものだと確信しています私の最後の質問は!

(役立つ場合は、さらにコードを投稿できます)更新:ここに私のアダプタークラス全体があります

public class CalcCursorAdapter extends SimpleCursorAdapter implement Filterable{

private Context mContext;
private ListView mListView;
private int mLayout;
private Cursor mcursor;

protected static class ViewHolder {
    protected TextView text;
    protected ImageButton button;
    private int position;
  }


@SuppressWarnings("deprecation")
public CalcCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) 
{
    super(context, layout, c, from, to);
    this.mContext = context;
    this.mLayout = layout;
    this.mcursor = c;

    //mListView = .getListView();

}       

@Override
public void bindView(View view, Context context, Cursor cursor) {
    TextView summary = (TextView)view.findViewById(R.id.calctvPrice);
    TextView savings = (TextView)view.findViewById(R.id.calctvSavings);
    summary.setText(cursor.getString(cursor.getColumnIndexOrThrow("qcFinalPrice")));
    savings.setText(cursor.getString(cursor.getColumnIndexOrThrow("qcSavings")));



}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    ViewHolder holder = new ViewHolder();

    LayoutInflater inflater = LayoutInflater.from(context);
    View v = inflater.inflate(R.layout.calc_list_item, parent, false);

    holder.button = (ImageButton) v.findViewById(R.id.qcbtnDelete);
    holder.button.setOnClickListener(deleteButton);
    holder.position = cursor.getInt(cursor.getColumnIndexOrThrow("_id"));
    bindView(v, context, cursor);
    v.setTag(holder);


    return v;

}

private OnClickListener deleteButton = new OnClickListener() {
    public void onClick(View v){
        View view = (View) v.getParent();
        ViewHolder holder = (ViewHolder) view.getTag();
        int position = holder.position;
        DbHelper mDbHelper;
        mDbHelper = new DbHelper(mContext);
        mDbHelper.open();
        mDbHelper.deleteCalc(position);
        mDbHelper.close();
        String test = Integer.toString(position);
        Toast.makeText(mContext.getApplicationContext(), test, Toast.LENGTH_SHORT).show();
        notifyDataSetChanged();

    }
};


public long qcItemId(int position) {

    return position;
}

}

どんな助けでも大歓迎です!

ありがとう。

4

2 に答える 2

0

Adapter と Fragment の概念を誤解していると思います。Fragment で Adapter を Fragment または AdapterView に設定できます。データを再クエリした後、Adapter.notifyDataSetChanged() を呼び出すと、Fragment または AdapterView が更新されます。

于 2013-05-21T03:11:52.160 に答える
0

アダプタ内にいるときは、直接呼び出すことができますnotifyDatasetChanged()。Adapter のオブジェクトは必要ありません。OOPS の概念を一新する必要があると思います。アダプターは BaseAdapter または ArrayAdapter または SimpleAdapter を拡張します。それらはすべてこのメソッドを持ち、独自のメソッドを呼び出すためにクラス自体のオブジェクトは必要ありません。

編集

notifyDataSetChanged()毎回ビューを膨らませているため、うまくいきませんでした。これはパフォーマンスの点で良いことではありません。この回答を確認してください。onContentChanged()の後に呼び出されますnotifyDataSetChanged()。それがあなたにとってどのように機能したかわかりません。物事を機能させるために使用することを強くお勧めしますnotifyDataSetChanged()。回避策には行かないでください。

于 2013-05-21T03:44:33.463 に答える