I have seen several posts on this but I cannot seem to follow one well enough to fix my problem.

I am trying to refresh my ListView after I update or delete a record. I am currently using notifyDataSetChanged() however it does not refresh upon deletion. I can delete, and then if i back our and reload my history.java it will show the updates because I am reloading all of the data.

here is my HistoryAdapter.java

public class HistoryAdapter extends BaseAdapter {

    private Context mContext;
    Cursor cursor;
    history historyClass = new history();
    MySQLiteHelper db;

    public HistoryAdapter(Context context, Cursor cur){
        super();
        mContext = context;
        cursor = cur;
        db = new MySQLiteHelper(context);
    }

    public int getCount(){
        // return the number of records in cursor
        return cursor.getCount();
    }

    // getView method is called for each item of ListView
    public View getView(final int position, View view, ViewGroup parent){

        // inflate the layout for each item of listView
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.history_list_item, null);

        // move the cursor to required position
        cursor.moveToPosition(position);

        final String id = cursor.getString(cursor.getColumnIndex("_id"));
        final long deleteId = Long.parseLong(id);

        // fetch the information for each card
        String pricePerGallon = cursor.getString(cursor.getColumnIndex("pricePerGallon"));
        String gallons = cursor.getString(cursor.getColumnIndex("gallons"));
        String odometer = cursor.getString(cursor.getColumnIndex("odometer"));
        String date = cursor.getString(cursor.getColumnIndex("date"));
        String filledOrNot = cursor.getString(cursor.getColumnIndex("filledOrNot"));
        String comments = cursor.getString(cursor.getColumnIndex("comments"));
        //String milesPerGallon = cursor.getString(cursor.getColumnIndex("miledPerGallon"));
        String totalSpent = cursor.getString(cursor.getColumnIndex("totalSpent"));

        // get the reference of TextViews
        TextView textViewPricePerGallon = (TextView) view.findViewById(R.id.cardPrice);
        TextView textViewGallons = (TextView) view.findViewById(R.id.cardGallons);
        TextView textViewOdometer = (TextView) view.findViewById(R.id.cardOdometer);
        TextView textViewDate = (TextView) view.findViewById(R.id.cardDate);
        TextView textViewFilledOrNot = (TextView) view.findViewById(R.id.cardFilledOrNot);
        TextView textViewComments = (TextView) view.findViewById(R.id.cardComments);
        //TextView textViewMilesPerGallon = (TextView) view.findViewById(R.id.mpg);
        TextView textViewTotalSpent = (TextView) view.findViewById(R.id.usd);
        TextView textViewDeleteButton = (TextView) view.findViewById(R.id.deleteButton);

        // Set the data to each TextView
        textViewPricePerGallon.setText(pricePerGallon);
        textViewGallons.setText(gallons);
        textViewOdometer.setText(odometer);
        textViewDate.setText(date);
        textViewFilledOrNot.setText(filledOrNot);
        textViewComments.setText(comments);
        //textViewMilesPerGallon.setText(milesPerGallon);
        textViewTotalSpent.setText(totalSpent);


        final HistoryAdapter historyAdapter = this;
        textViewDeleteButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
              Log.d("History Adapter", "" + deleteId);
              //need to delete here
              deleteRecord(deleteId);
              historyAdapter.notifyDataSetChanged();


            }
     });

        return view;

    }

    public Object getItem(int position){
        return position;
    }

    public long getItemId(int position){
        return position;
    }

    private void deleteRecord(long id){
        db.deleteGasLog(id);
    }

}

here is my history.java which sets the adapter and creates the listview

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.history);

        context = this;
        initViews();

        cursor = db.getAllLogs();

        // Create the Adapter
        historyAdapter = new HistoryAdapter(this, cursor);

        // Set the adapter to ListView
        listContent.setAdapter(historyAdapter);

    }
有帮助吗?

解决方案

I guess you will need to get a new cursor.

Try moving this

cursor = db.getAllLogs();

into the adapter and call it again before the notifyDataSetChanged() call.

其他提示

You are deleting the row but you are never updating or getting a new cursor, which has the result set the adapter uses to layout the list. You need to give the adapter a new cursor after you delete a row, then call notifyDatasetChanged(). If you use SimpleCursorAdapter instead of BaseAdapter, you can use its swapCursor() method to set the new cursor.

Make sure to call:

registerDataSetObserver(...)

from your BaseAdapter subclass.

Pass it the reference to your DataSetObserver implementation. Possibly through an inner class of HistoryAdapter:

public class HistoryAdapter extends BaseAdapter {
. . .
  public class MyDataSetObserver extends DataSetObserver {
    public void onChanged() {
     // Data Set changed.... do something...
    }
    public void onValidated() {
     // Your implementation here
    }
  }
. . .
  public HistoryAdapter(Context context, Cursor cur) {
    . . .
    registerDataSetObserver(new MyDataSetObserver());
    . . .
  }
}

HTH

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top