从Button的Onclick中的Adapter类重新加载ListView数据

时间:2014-05-05 11:20:46

标签: android listview android-listview android-arrayadapter

我正在尝试构建一个具有自定义适配器的应用程序,并且所有ListView行都有三个Button。我对自定义适配器中的所有onClick进行了Button操作。单击Button时我可以更改数据源但是我无法从自定义适配器重新加载数据。

public class CallListViewCustomAdapter extends ArrayAdapter<Person> {
 Context context;
 SQLiteDatabase sb;
 private static final String SAMPLE_DB_NAME = "androidData.sqlite";
 private static final String SAMPLE_TABLE_NAME = "calldetails";
    int layoutResourceId;   
    ArrayList<Person> data = new ArrayList<Person>();

    public CallListViewCustomAdapter(Context context, int layoutResourceId, ArrayList<Person> data) {
        super(context, layoutResourceId,data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }
    public void refresh(ArrayList<Person>list)
    {           
        data = list;
        notifyDataSetChanged();
    } 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = null;
        View row = convertView;
       final int fPosition = position;
        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);               
            final WeatherHolder holder = new WeatherHolder();
            holder.phoneNumber = (TextView)row.findViewById(R.id.number);
            holder.fname =  (TextView)row.findViewById(R.id.fName);
            holder.call = (Button)row.findViewById(R.id.callButton);
            holder.skip = (Button)row.findViewById(R.id.skip);
            holder.called = (Button)row.findViewById(R.id.called);
            holder.called.setTag(position);
            Person weather = data.get(position);
            holder.phoneNumber.setText(weather.number);
            holder.fname.setText(weather.fName);
            holder.call.setOnClickListener(new View.OnClickListener() {                 
                @Override
                public void onClick(View arg0) {
                    holder.called.setVisibility(View.VISIBLE);///error comes 
                    holder.skip.setVisibility(View.VISIBLE);///error comes 
                    Intent callIntent = new Intent(Intent.ACTION_CALL);
                    callIntent.setData(Uri.parse("tel:" + data.get(fPosition).number));
                    callIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(callIntent);                  

                }
            });
            holder.called.setOnClickListener(new View.OnClickListener() {                   
                @Override
                public void onClick(View arg0) {
                    //business logic for data source change 
                    refresh(data);///I want listview change here
                    sb.close();
                    Log.v("ONMESSAGE", "HARD");
                    }
            });
          //  holder.desc= (TextView)row.findViewById(R.id.txtViewDescription);
           // holder.switchState = (Switch)row.findViewById(R.id.switch1);             
            row.setTag(holder);
        }




        return row;
    }

    static class WeatherHolder
    {
        TextView phoneNumber;
        TextView fname;
        Switch switchState;
        Button call,skip,called;
    }

}

使用列表的片段

public class NewFragment extends Fragment{
View rootView;
ProgressDialog pDialog;
private ListView listView1;
CallListViewCustomAdapter adapter;
private static final String SAMPLE_DB_NAME = "androidData.sqlite";
private SQLiteDatabase sampleDB;

ArrayList<Person>list;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    rootView = inflater.inflate(R.layout.newfragment, container, false);
    initDB();       
    list = new ArrayList<Person>();
    new CallLogDetails().execute();
    return rootView;
}
public int checkTable() {
    int return_var = 0;
    sampleDB = getActivity().openOrCreateDatabase(SAMPLE_DB_NAME, Context.MODE_PRIVATE, null);
    Cursor cc = sampleDB.rawQuery("SELECT * FROM " + "calldetails", null);
    if (cc != null){
        if (cc.moveToFirst()) {
            do {
                return_var = cc.getInt(1);
            } while (cc.moveToNext());
        }
    }


    return return_var;
}
public void parseandStoreOpearation()
{
    try{
        CSVReader reader = new CSVReader(new InputStreamReader(getActivity().getAssets().open("batch2.csv")));
        String [] nextLine;
        sampleDB = getActivity().openOrCreateDatabase(SAMPLE_DB_NAME, Context.MODE_PRIVATE, null);

        while ((nextLine = reader.readNext()) != null) {
            //Log.v("ONMESSAGE", "YES");
            Log.v("ONMESSAGE", "Name: [" + nextLine[0] + "]\nAddress: [" + nextLine[1] + "]\nEmail: [" + nextLine[2] + "]");
            if(!nextLine[0].equals("First Name"))
            {
                //Person newPerson = new Person(nextLine[0],nextLine[1], nextLine[2], 1);
                ContentValues cv = new ContentValues();
                cv.put("callNumber", nextLine[2]);
                cv.put("fName", nextLine[0]);
                cv.put("lName", nextLine[1]);
                cv.put("callflag", 1);
                sampleDB.insert("calldetails", null, cv);
                //list.add(newPerson);

            }
        }       
        }
        catch(Exception e)
        {
            Log.v("ONMESSAGE", "EXCEPTION " + e.toString());
        }
}
 public ArrayList<Person> getList()
 {
     ArrayList<Person> arr = new ArrayList<Person>();
     sampleDB= getActivity().openOrCreateDatabase(SAMPLE_DB_NAME, Context.MODE_PRIVATE, null);
     Cursor cc = sampleDB.rawQuery("SELECT * FROM " +"calldetails", null);      
     if(cc != null)
    if(cc.moveToFirst()){
     do
     {   Log.v("Datas",cc.getString(2)+ " " +cc.getString(3) + " " + cc.getString(1) + " " + cc.getInt(4));
         Person ph = new Person(cc.getString(2), cc.getString(3), cc.getString(1),cc.getInt(4),cc.getInt(0));           
         arr.add(ph);

     }while(cc.moveToNext());
    }
     sampleDB.close();
     Log.v("ONMESSAGE", new Integer(arr.size()).toString());
     return arr;
 }
 private void initDB() {
        sampleDB =  getActivity().openOrCreateDatabase(SAMPLE_DB_NAME, Context.MODE_PRIVATE, null);
        sampleDB.execSQL("CREATE TABLE IF NOT EXISTS " +
                "calldetails" +" (callid INTEGER PRIMARY KEY AUTOINCREMENT,"+ "callNumber TEXT," +
                " fName TEXT," + "lName TEXT," + "callflag INTEGER);");


    }

private class CallLogDetails extends AsyncTask<Void,Void,Void>{

    @Override
     protected void onPreExecute(){
        pDialog = new ProgressDialog(getActivity());
        pDialog.setTitle("Processing");
        pDialog.setMessage("Loading Number List");
        pDialog.setIndeterminate(true);
        pDialog.setCancelable(false);
        pDialog.show();
     }

    protected void onPostExecute(Void params){
        super.onPostExecute(params);
        pDialog.dismiss();
        if(list.size() == 0)
     {
         list.add(new Person("No Data", "NO Data", "No Data", 0,0));
     }

     Collections.reverse(list);
     if(adapter != null)
     adapter.clear();
     adapter = new CallListViewCustomAdapter(getActivity(),
                R.layout.listview_row, list);
     listView1 = (ListView)getActivity().findViewById(R.id.lvAlbumList);

    listView1.setOnItemLongClickListener(new OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                final int arg2, long arg3) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle("Delete Record");
            builder.setMessage("Do you want to delete the record?");
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    // TODO Auto-generated method stub
                    if(list.size() > 0){

                    sampleDB=getActivity().openOrCreateDatabase(SAMPLE_DB_NAME, SQLiteDatabase.OPEN_READWRITE, null);
                     //sampleDB.execSQL("DELETE FROM "+ SAMPLE_DB_NAME + " " + "WHERE callDesc= " + desc);
                    //sampleDB.execSQL("DELETE FROM calldetails WHERE callDesc='"+desc+"';"); 
                    Toast.makeText(getActivity(), "Row Deleted", Toast.LENGTH_LONG).show();
                     sampleDB.close();
                     new CallLogDetails().execute();
                    }
                    else
                        Toast.makeText(getActivity(), "This is a default object. You can not delete this.", Toast.LENGTH_LONG).show();

                }
            });
            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    // TODO Auto-generated method stub
                    arg0.cancel();

                }
            });
            builder.show();
                 return false;

}
});

     listView1.setAdapter(adapter);


    }
    @Override
    protected Void doInBackground(Void... arg0) {
        list.clear();
        if(checkTable() == 0)
        {
            parseandStoreOpearation();
        }
        list = getList();
        Log.v("ONMESSAGE", "Doing");
        return null;
    }

 }

}

4 个答案:

答案 0 :(得分:2)

对于ArrayAdapter,notifyDataSetChanged()仅在您使用适配器上的添加,插入,移除和清除功能时才有效。

请尝试以下代码:

public void refresh(ArrayList<Person>list)
 {           

    data.clear();
    data.addAll(list);

    this.notifyDataSetChanged();
 } 

答案 1 :(得分:1)

在活动中做这样的事情

CallListViewCustomAdapter thadapter=new CallListViewCustomAdapter(MainActivity.this, R.layout.list,numAl);
NumberList.setAdapter(thadapter);

@Override
public void onClick(View v) {

thadapter.notifyDataSetChanged();

}
});

答案 2 :(得分:1)

调用notifyDataSetChanged()并调用适配器

答案 3 :(得分:0)

notifyDataSetChanged()方法调用ListView适配器对象。