1.直接在继承适配器类的子类中的getView方法里执行notifyDataSetChanged方法:
举个栗子,在listView的item的xml中添加一个button,点击该button,那么就会删除该数据。
list_item.xml如下所示:
自定义的适配器类MyBaseAdapter如下所示:
packagecom.example.dell.listviewsqlite;importandroid.content.Context;importandroid.content.DialogInterface;importandroid.database.sqlite.SQLiteDatabase;importandroid.support.v7.app.AlertDialog;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.Button;importandroid.widget.TextView;importjava.util.ArrayList;/*** Created by dell on 2017/12/1.*/public classMyBaseAdapter extendsBaseAdapter {
privateArrayList dataID;privateArrayList dataInfo;privateLayoutInflater mInflater;privateContext mainContext;privateSQLiteOp sqLiteOp;publicMyBaseAdapter(Context context,SQLiteOp sqLiteOp,ArrayList dataID,ArrayList dataInfo){
this.dataID=dataID;this.dataInfo=dataInfo;this.mInflater= LayoutInflater.from(context);this.mainContext=context;this.sqLiteOp=sqLiteOp;}
@Overridepublic intgetCount() {
return this.dataID.size();}
@OverridepublicObject getItem(intposition) {
return null;}
@Overridepublic longgetItemId(intposition) {
returnposition;}
@OverridepublicView getView(final intposition,View convertView,ViewGroup parent) {
ViewHolder holder;if(convertView == null) {
holder=newViewHolder();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(newView.OnClickListener() {
@Overridepublic voidonClick(View v) {
showInfo(position);}
});returnconvertView;}
// listview中点击按键弹出对话框private voidshowInfo(final intposition) {
newAlertDialog.Builder(this.mainContext).setTitle("我的提示").setMessage("确定要删除吗?")
.setPositiveButton("确定",newDialogInterface.OnClickListener() {
@Overridepublic voidonClick(DialogInterface dialog, intwhich) {
dataID.remove(position);dataInfo.remove(position);deleteDataInDB(position);// 通过程序我们知道删除了,但是怎么刷新ListView呢?// 只需要重新设置一下adapternotifyDataSetChanged();}}
)
.setNegativeButton("取消",null)
.show();}
private voiddeleteDataInDB(intposition){
SQLiteDatabase db=this.sqLiteOp.getWritableDatabase();String whereClause = "id=?";String[] whereArgs = {this.dataID.get(position)};db.delete("testDB",whereClause,whereArgs);db.close();}
classViewHolder
{
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(newView.OnClickListener() {
@Overridepublic voidonClick(View v) {
Intent intent=newIntent(MainActivity.this,InputData.class);startActivityForResult(intent,1);}
});
上述代码点击ID为AddData的button即跳转到子窗体。
2.在子窗体更新完listView中要展示的数据后(假设数据存在SQLite中,这样父窗体和子窗体都可以随意处理listView中要展示的数据),要返回父窗体:
addDataBtn=(Button)findViewById(R.id.SureAddData);addDataBtn.setOnClickListener(newView.OnClickListener() {
@Overridepublic voidonClick(View v) {
String inputString=InputData.this.inputText.getText().toString();if(checkInput(inputString)){
Intent intent=newIntent();intent.putExtra("InputData",inputString);setResult(1,intent);finish();}
}
});
在点击ID为SureAddData的按钮后,程序返回父窗体。
3.重载父窗体的onActivityResult方法,对适配器和listView对象重新赋值:
@Overrideprotected voidonActivityResult(intrequestCode, intresultCode,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 voidresetListView(){
this.resetData();myBaseAdapter=newMyBaseAdapter(this,this.sqLiteOp,this.dataID,this.dataInfo);showListView.setAdapter(myBaseAdapter);}
private voidresetData(){
this.dataID.clear();this.dataInfo.clear();this.getDataFromDB();}
private voidgetDataFromDB() {
SQLiteDatabase db = this.sqLiteOp.getReadableDatabase();String[] columns = {"id","data"};Cursor cursor = db.query("testDB",columns, null, null, null, null, null);//判断游标是否为空if(cursor.moveToFirst())
{
do{
intid = 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(newView.OnClickListener() {
@Overridepublic voidonClick(View v) {
Intent intent=newIntent(MainActivity.this,InputData.class);startActivity(intent);}
});
2.子窗体更新完数据后,放回父窗体:
addDataBtn=(Button)findViewById(R.id.SureAddData);addDataBtn.setOnClickListener(newView.OnClickListener() {
@Overridepublic voidonClick(View v) {
Intent intent=newIntent();finish();
}
});
3.重载父窗体的onResume方法:
@Overrideprotected voidonResume() {
super.onResume();resetListView(); }
private voidresetListView(){
this.resetData();myBaseAdapter=newMyBaseAdapter(this,this.sqLiteOp,this.dataID,this.dataInfo);showListView.setAdapter(myBaseAdapter);}
private voidresetData(){
this.dataID.clear();this.dataInfo.clear();this.getDataFromDB();}
private voidgetDataFromDB() {
SQLiteDatabase db = this.sqLiteOp.getReadableDatabase();String[] columns = {"id","data"};Cursor cursor = db.query("testDB",columns, null, null, null, null, null);//判断游标是否为空if(cursor.moveToFirst())
{
do{
intid = 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();}