数据从自定义适配器更改后刷新列表视图

时间:2014-02-21 22:00:51

标签: android listview custom-adapter notifydatasetchanged

我已经看过几篇关于此的帖子,但我似乎无法很好地解决我的问题。

我在更新或删除记录后尝试刷新ListView。我目前正在使用notifyDataSetChanged()但是在删除时它不会刷新。我可以删除,然后如果我支持并重新加载我的 history.java ,它将显示更新,因为我正在重新加载所有数据。

这是我的 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);
    }

}

这是我的 history.java ,它设置适配器并创建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);

    }

3 个答案:

答案 0 :(得分:1)

我想你需要一个新的光标。

尝试移动此

cursor = db.getAllLogs();

进入适配器并在notifyDataSetChanged()通话之前再次调用它。

答案 1 :(得分:0)

您正在删除该行,但您永远不会更新或获取新游标,该游标具有适配器用于布局列表的结果集。删除行后,需要为适配器指定一个新游标,然后调用notifyDatasetChanged()。如果您使用SimpleCursorAdapter  而不是BaseAdapter,您可以使用其swapCursor()方法来设置新光标。

答案 2 :(得分:0)

请务必致电:

registerDataSetObserver(...)
来自BaseAdapter子类的

将引用传递给DataSetObserver实现。可能通过内部类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