android ListView重绘的三种方法

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值