android listview 不重绘,android ListView重绘的三种方法

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();}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值