1.直接在继承适配器类的子类中的getView方法里执行notifyDataSetChanged方法:
举个栗子,在listView的item的xml中添加一个button,点击该button,那么就会删除该数据。
list_item.xml如下所示:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:orientation="vertical"> <TextView android:id="@+id/DataID" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TextView" android:textSize="18sp" /> <TextView android:id="@+id/DataInfo" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TextView" android:textSize="18sp" /> </LinearLayout> <Space android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" /> <Button android:id="@+id/DeleteData" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:text="@string/delete_data" /> </LinearLayout>
自定义的适配器类MyBaseAdapter如下所示:
package com.example.dell.listviewsqlite; import android.content.Context; import android.content.DialogInterface; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.TextView; import java.util.ArrayList; /** * Created by dell on 2017/12/1. */ public class MyBaseAdapter extends BaseAdapter { private ArrayList<String> dataID; private ArrayList<String> dataInfo; private LayoutInflater mInflater; private Context mainContext; private SQLiteOp sqLiteOp; public MyBaseAdapter(Context context,SQLiteOp sqLiteOp, ArrayList<String> dataID, ArrayList<String> dataInfo){ this.dataID=dataID; this.dataInfo=dataInfo; this.mInflater = LayoutInflater.from(context); this.mainContext=context; this.sqLiteOp=sqLiteOp; } @Override public int getCount() { return this.dataID.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder=new ViewHolder(); convertView = mInflater.inflate(R.layout.list_item, parent,false); holder.id = (TextView)convertView.findViewById(R.id.DataID); holder.data = (TextView)convertView.findViewById(R.id.DataInfo); holder.deleteBtn=(Button)convertView.findViewById(R.id.DeleteData); convertView.setTag(holder); }else { holder = (ViewHolder)convertView.getTag(); } holder.id.setText(this.dataID.get(position)); holder.data.setText(this.dataInfo.get(position)); holder.deleteBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showInfo(position); } }); return convertView; } // listview中点击按键弹出对话框 private void showInfo(final int position) { new AlertDialog.Builder(this.mainContext).setTitle("我的提示").setMessage("确定要删除吗?") .setPositiveButton("确定",new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dataID.remove(position); dataInfo.remove(position); deleteDataInDB(position); // 通过程序我们知道删除了,但是怎么刷新ListView呢? // 只需要重新设置一下adapter notifyDataSetChanged(); }} ) .setNegativeButton("取消",null) .show(); } private void deleteDataInDB(int position){ SQLiteDatabase db=this.sqLiteOp.getWritableDatabase(); String whereClause = "id=?"; String[] whereArgs = {this.dataID.get(position)}; db.delete("testDB",whereClause,whereArgs); db.close(); } class ViewHolder { TextView id; TextView data; Button deleteBtn; } }
上述代码中有个showInfo方法,在list_item中的button的onclick函数中被调用,里面主要是一个对话框,查问是否删除该item,是则删除需要展示的数据,然后进行list_view的重绘,即进行:
dataID.remove(position); dataInfo.remove(position); notifyDataSetChanged();dataID和dataInfo都是自定义的数据,类型为ArrayList,分别对应list_item中的两个TextView。
2.利用消息回传机制,在父窗体的onActivityResult对适配器listView和对象进行重新赋值。
举个栗子,我们现在把listView中要展示的数据存在SQLite中,我们可以在父窗体点击添加数据按钮,跳转到子窗体。在子窗体添加完数据后,跳转回父窗体,父窗体要刷新listView。
1.为了进行数据回传,首先在父窗体进行如下操作创建子窗体:
this.addDataBtn=(Button)findViewById(R.id.AddData); addDataBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,InputData.class); startActivityForResult(intent,1); } });上述代码点击ID为AddData的button即跳转到子窗体。
2.在子窗体更新完listView中要展示的数据后(假设数据存在SQLite中,这样父窗体和子窗体都可以随意处理listView中要展示的数据),要返回父窗体:
addDataBtn=(Button)findViewById(R.id.SureAddData); addDataBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String inputString=InputData.this.inputText.getText().toString(); if(checkInput(inputString)){ Intent intent=new Intent(); intent.putExtra("InputData",inputString); setResult(1,intent); finish(); } } });在点击ID为SureAddData的按钮后,程序返回父窗体。
3.重载父窗体的onActivityResult方法,对适配器和listView对象重新赋值:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode==1&&resultCode==1){ String inputData=data.getStringExtra("InputData"); addIntoSQLite(inputData); resetListView(); // Toast.makeText(MainActivity.this,inputData,Toast.LENGTH_LONG).show(); } } private void resetListView(){ this.resetData(); myBaseAdapter=new MyBaseAdapter(this,this.sqLiteOp,this.dataID,this.dataInfo); showListView.setAdapter(myBaseAdapter); } private void resetData(){ this.dataID.clear(); this.dataInfo.clear(); this.getDataFromDB(); } private void getDataFromDB() { SQLiteDatabase db = this.sqLiteOp.getReadableDatabase(); String[] columns = {"id", "data"}; Cursor cursor = db.query("testDB", columns, null, null, null, null, null); //判断游标是否为空 if (cursor.moveToFirst()) { do{ int id = cursor.getInt(0); this.dataID.add(String.valueOf(id)); String dataInfo = cursor.getString(1); this.dataInfo.add(dataInfo); }while (cursor.moveToNext()); } cursor.close(); db.close(); }
3.重载父窗体的onResume方法,在里面对对适配器和listView对象重新赋值:
栗子同上,我们现在listView中要展示的数据存在SQLite中,我们可以在父窗体点击添加数据按钮,跳转到子窗体。在子窗体添加完数据后,跳转回父窗体,父窗体要刷新listView。
1.按普通方法创建子窗体:
this.addDataBtn=(Button)findViewById(R.id.AddData); addDataBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,InputData.class); startActivity(intent); } });
2.子窗体更新完数据后,放回父窗体:
addDataBtn=(Button)findViewById(R.id.SureAddData); addDataBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(); finish(); } });
3.重载父窗体的onResume方法:
@Override protected void onResume() { super.onResume();resetListView();
}private void resetListView(){ this.resetData(); myBaseAdapter=new MyBaseAdapter(this,this.sqLiteOp,this.dataID,this.dataInfo); showListView.setAdapter(myBaseAdapter); } private void resetData(){ this.dataID.clear(); this.dataInfo.clear(); this.getDataFromDB(); } private void getDataFromDB() { SQLiteDatabase db = this.sqLiteOp.getReadableDatabase(); String[] columns = {"id", "data"}; Cursor cursor = db.query("testDB", columns, null, null, null, null, null); //判断游标是否为空 if (cursor.moveToFirst()) { do{ int id = cursor.getInt(0); this.dataID.add(String.valueOf(id)); String dataInfo = cursor.getString(1); this.dataInfo.add(dataInfo); }while (cursor.moveToNext()); } cursor.close(); db.close(); }