2014-01-10 153 views
1

我是Android开发新手,我在可能的应用程序中有Listview,Listview中填充了来自Sqlite数据库的数据。我想使用这个列表视图上的复选框&删除选定的项目。 我想清除Sqlite Db中选定的数据行。 任何有用的帮助将不胜感激。从列表视图中删除数据

首先我必须在我的应用程序获取短信如下:` 如果(捆绑!= NULL){

  //—retrieve the SMS message received— 
      Object messages[] = (Object[]) bundle.get("pdus"); 
      SmsMessage smsMessage[] = new SmsMessage[messages.length]; 

      for (int n = 0; n < messages.length; n++) { 
       smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]); 
       timestamp = smsMessage[n].getTimestampMillis(); 

       number = smsMessage[n].getOriginatingAddress(); 
       body += smsMessage[n].getDisplayMessageBody(); 
       abortBroadcast(); 
       blockMessage(context); 
      } // end for loop 
     } // bundle is null 

    } catch (Exception e) { 
     Log.e("SmsReceiver", "Exception smsReceiver" +e); 

    } 
} 
private void blockMessage(Context context) { 

    // instantiate DbMNager object to insert sms in database 
    //formating receiving time: 
    //SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-hh.mm.ss"); 
    SimpleDateFormat formatter = new SimpleDateFormat("EEEE, MMMM d HH:mm:ss a"); 
    String formatedTime = formatter.format(timestamp); 
    DBmanager= new DbManager(context); 
    DBmanager.open(); 
    DBmanager.Insert_sms_data(formatedTime ,number,body); 
    DBmanager.close();` 

然后存储SQLite中DB如下:

public void Insert_sms_data(String formatedTime, String number, String body){ 
    try{ 

     SQLiteDatabase DB = this.getWritableDatabase(); 
     ContentValues cv = new ContentValues(); 
     cv.put(SMS_Time, formatedTime); 
     cv.put(PHONE_NUMBER, number); 
     cv.put(MESSAGE_BODY, body); 
     DB.insert(TABLE_SMS, null, cv); 
     DB.close(); 

    } 
    catch(Exception ex) 
    { 
     Log.e("ERROR in insertion", ex.toString()); 
    } 

} 

public Cursor Return_All(){ 

    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cur = db.rawQuery("SELECT * FROM "+"SMS_TABLE", null); 
    return cur; 

} 
// Clear all messaged 
public void ClearAll(){ 
    SQLiteDatabase db = this .getWritableDatabase(); 
    db.delete(TABLE_SMS, null, null); 
    db.close(); 
} 

在获得之后在我的listview Activity中成功。

public class MainActivity extends Activity { 
ListView listViewSMS; 
Context context; 
DbManager manager; 
Button btn_clearall; 
Cursor cursor; 
SimpleCursorAdapter adapter; 
//array from is the column name in your cursor where you're getting the data 

String[] from = new String[]{"Phone_number","Message_body","Time"}; 
//array toIDs contains the id of textViews 


int[] toIDs = new int[]{R.id.textViewSMSSender,R.id.textViewMessageBody,R.id.textViewMSMStime}; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.listview_activity_main); 
    context=this; 
    //get the ListView Reference 
    try{ 
     listViewSMS=(ListView)findViewById(R.id.listViewSMS); 
     listViewSMS.setChoiceMode(listViewSMS.CHOICE_MODE_MULTIPLE); 

     manager = new DbManager(context); 
     cursor = manager.Return_All(); 

     SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.listview_each_item, cursor, from, toIDs); 
     listViewSMS.setAdapter(adapter); 
     adapter.notifyDataSetChanged(); 
     //refreshCursor(); 

     listViewSMS.setOnItemClickListener(new OnItemClickListener(){ 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View v, int position, 
        long arg3) { 

       int itemId = Integer.valueOf(String.valueOf(position)); 
       cursor.moveToPosition(itemId); 
       int messageId = cursor.getInt(0); 
       deleteMessage(messageId); 

            Toast.makeText(getApplicationContext(), "current position"+itemId, Toast.LENGTH_LONG).show(); 
            TextView tv_SMSSenderNumber=(TextView)v.findViewById(R.id.textViewSMSSender); 
            TextView tv_SMSBody=(TextView)v.findViewById(R.id.textViewMessageBody); 
            TextView tv_SMSTime=(TextView)v.findViewById(R.id.textViewMSMStime); 
            String smsSender=tv_SMSSenderNumber.getText().toString(); 
            String smsBody= tv_SMSBody.getText().toString(); 
            String smsTime= tv_SMSTime.getText().toString();  
      } 

     }); 

    } 

    catch(Exception ex){ 
     Log.e("ERROR!!", ex.toString()); 
    } 


    btn_clearall = (Button)findViewById(R.id.btn_Delall); 
    btn_clearall.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      clearMessages(); 
      //refreshCursor(); 

// adapter.notifyDataSetChanged();

 } 
    }); 

    CheckBox cb_sms_lv = (CheckBox)findViewById(R.id.cb_smslist); 


} 

protected void clearMessages() { 
    new AlertDialog.Builder(MainActivity.this).setIcon(
      android.R.drawable.ic_dialog_alert).setTitle(R.string.delete) 
      .setMessage(getString(R.string.clear_message_confirm)) 
      .setPositiveButton(R.string.delete, 
        new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface di, int i) { 
        manager = new DbManager(
          context); 
        manager.open(); 
        manager.ClearAll(); 
        manager.close(); 
        refreshCursor(); 
       } 
      }).setNegativeButton(R.string.cancel, 
        new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface di, int i) { 
       } 
      }).show(); 
} 

private void deleteMessage(final int messageId){ 
    new AlertDialog.Builder(MainActivity.this).setIcon(
      android.R.drawable.ic_dialog_alert).setTitle(R.string.delete) 
      .setMessage(getString(R.string.delete_message_confirm)) 
      .setPositiveButton(R.string.delete, 
        new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface di, int i) { 
        manager = new DbManager(
          context); 
        manager.open(); 
        manager.deleteMessage(messageId); 
        manager.close(); 
        refreshCursor(); 
       } 
      }).setNegativeButton(R.string.cancel, 
        new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface di, int i) { 
       } 
      }).show(); 
} 

public void refreshCursor() { 
    manager = new DbManager(context); 
    manager.open(); 
    cursor = manager.Return_All(); 

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.listview_each_item, cursor, from, toIDs); 
    listViewSMS.setAdapter(adapter); 
    manager.close(); 

} 



@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

我可以成功地删除整个线程,但现在我wantt使用复选框 删除列表视图,从几个短信任何有用的教程吗?

+1

使用自定义适配器的列表视图 – jyomin

+0

所以我们一些代码你做了什么? – 2014-01-10 04:36:06

+0

请按照您所做的一切显示一些代码 – PsyGik

回答

3

试试这个

代码从列表视图中删除项目

int index = Integer.parseInt(position+""); 
       ArrayList.remove(index); 
       notifyDataSetChanged(); 

然后使用查询从Sqite数据库中删除数据

1

一点小费可以帮助。由于您有数据,请跟踪标记的项目。存储他们的ID。一旦用户点击完成或任何按钮,运行一个SQL查询,删除记录与ID。然后调用列表视图的notifyDataSetChanged。由于光标有变化,notifyDataSetChanged可能无法正常工作,因此请再次重新填充光标。

参考Refresh ListViewthis

1

如果从DATABSE,你在你的问题不是使用notifydatasetchanged列表视图的方法来重新加载列表视图用新的数据说,成功地删除数据。

1

对于自定义适配器使用列表项的行XML作为:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 

    <TextView 

     android:id="@+id/data" 
     android:padding="10dp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dp" 
     /> 

    <CheckBox 
     android:id="@+id/checkbox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@+id/data" 
     android:checked="false" /> 

</RelativeLayout> 

,并在自定义适配器的java类

public class CustomAdapter extends BaseAdapter{ 

    ArrayList<String> mlistdata; 
    private LayoutInflater layoutinflater; 
    private Context mContext; 
    public CustomAdapter(Context context,ArrayList<String> elements) 
    { 
     mlistdata = elements; 
     layoutinflater=LayoutInflater.from(context); 
     mContext=context; 

    } 
    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return mlistdata.size(); 
    } 

    @Override 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public View getView(final int arg0, View convertview, ViewGroup arg2) { 
     // TODO Auto-generated method stub 
     final ViewHolder holder; 
     if(convertview==null) 
     { 
      holder = new ViewHolder(); 
      convertview = layoutinflater.inflate(R.layout.gallery_items, null); 
      holder.txt=(TextView)convertview.findViewById(R.id.data); 
      holder.cb=(CheckBox)convertview.findViewById(R.id.checkbox); 
      convertview.setTag(holder); 
     } 
     else{ 
      holder=(ViewHolder)convertview.getTag(); 
     } 
     holder.txt.setText((mlistdata.get(arg0)).toString()); 

    holder.cb.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      if(holder.cb.isChecked()) 
      { 
      //database related operation 
     } 
      else 
     { 
     //database related operation 
     } 
      } 

    }); 


    return convertview; 
} 
static class ViewHolder 
{ 
    TextView txt; 
    CheckBox cb; 
} 
0

尝试这种解决方案here

在EmployeeAdapter.java你会

已经检查并取消选中dataList,并在此文件中写入方法getDataList();

例子:

public List<employeemodel> getDataList(){ 
    return employeeData; 
} 

使用这种方法在你的活动是利用yourAdapter.getDataList();

得到DataList控件执行删除操作和新的DataList设置为您的适配器,并呼吁yourListView.notifyDatasetChange();后。

0

自定义适配器和notifyDataSetChanged()

相关问题