2014-11-08 146 views
0

好的,所以我試圖從ListView中刪除元素,並且一切順利,直到我嘗試刪除最後一個元素,但只有當我刪除第二個元素並嘗試刪除最後一個。這裏是我的代碼:從列表視圖中刪除最後一個元素

public class TestActivity extends ListActivity { 

ListView list; 
PAdapter adapter; 
static SQLiteDatabase db; 
static ArrayList<Profesor> datos; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test); 

db = openOrCreateDatabase("DBLogin", MODE_PRIVATE, null); 
    db.execSQL("CREATE TABLE IF NOT EXISTS Profesor (Id integer primary key AUTOINCREMENT" 
      + ", Nombre" + " varchar(30), Imagen varchar(15), Fecha" + " varchar(15)" + 
      ", Direccion varchar(35), sexo varchar(10), Telefono varchar(15), creado int);"); 

    list = (ListView) findViewById(android.R.id.list); 

    datos = new ArrayList<Profesor>(); 

    datos = datos(); 
    adapter = new PAdapter(this, R.layout.row, datos); 

    setListAdapter(adapter); 



list.setOnItemLongClickListener(new OnItemLongClickListener(){ 

     @Override 
     public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
       int arg2, long arg3) { 
      if (datos.get(arg2).getCreado() == 1) { 
       PopupMenu popup = new PopupMenu(TestActivity.this, list); 
       popup.getMenuInflater().inflate(R.menu.popup3, popup.getMenu()); 
       final int id = arg2; 
       popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
        public boolean onMenuItemClick(MenuItem item) { 
         delete(datos.get((int)adapter.getItemId(id))); 
         datos = datos(); 
         adapter = new PAdapter(TestActivity.this, R.layout.row, datos); 
         setListAdapter(adapter); 
         list.invalidateViews(); 
         return true; 
        } 
       }); 

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


private ArrayList<Profesor> datos(){ 
    ArrayList<Profesor> ap = new ArrayList<Profesor>(); 
    Cursor cursor = db.rawQuery("SELECT * FROM Profesor", null); 
    if(cursor.moveToFirst()){ 
     do { 
      Profesor p = new Profesor(null, null); 
      p.setId(cursor.getInt(0)); 
      p.setNombre(cursor.getString(1)); 
      p.setFecha(cursor.getString(3)); 
      p.setDireccion(cursor.getString(4)); 
      p.setSexo(cursor.getString(5)); 
      p.setImagen(cursor.getString(2)); 
      p.setCreado(cursor.getInt(7)); 
      p.setTelefono(cursor.getString(6)); 
      ap.add(p); 
     } while(cursor.moveToNext()); 
    } 
    return ap; 
} 

public static void delete(Profesor p){ 
    db.execSQL("DELETE FROM Profesor WHERE Id = " + p.getId() + ";"); 
} 

這裏是類PAdapter:

public class PAdapter extends ArrayAdapter<Profesor> { 

private Context context; 
private int layout; 
private ArrayList<Profesor> datos; 

public PAdapter(Context context, int layout, ArrayList<Profesor> datos) { 
    super(context, layout, datos); 
    this.context = context; 
    this.layout = layout; 
    this.datos = datos; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View item = inflater.inflate(layout, parent, false); 

    ImageView imagen = (ImageView) item.findViewById(R.id.imageView1); 
    datos.get(position).imagen(imagen, context, false); 


    TextView nombre = (TextView) item.findViewById(R.id.tNombre); 
    nombre.setText(datos.get(position).getNombre()); 


    return item; 
} 

}

有趣的是,它執行的代碼之後刪除,但不會刪除最後一個元素,無論是它會拋出我一個例外嗎?再次,它只發生在最後一個元素上,並且只有在我刪除之前,如果我關閉並重新打開應用程序後,我可以正常刪除它。

+0

檢查:http://stackoverflow.com/questions/26623385/how-can-i-delete-my-list-row-by-clicking-on-button-in-each-row-of- the-listview/26623451#26623451 – 2014-11-08 09:30:05

回答

0

我假設你傳遞了pos = 3作爲參數值。由於列表的大小爲3,最後一個元素的位置應該是2

*編輯:

記住,開始的ListView指數和適配器是不同的。 ListView項目pos從「1」開始作爲第一個位置,適配器(如數組)從索引「0」開始作爲第一個位置。

adapter.remove(adapter.getItem(pos-1)); 
+0

我很確定這個項目的位置是從0開始的,我使用了類似的代碼,它的工作原理是單調的,除了它不會刪除你選擇的元素。另外我認爲它會給出一個ArrayIndexOutOfBoundsException或類似的東西。 – Jairo 2014-11-10 06:15:35

0

你的代碼有一些錯誤。我提出以下建議不承諾將解決當前的問題,但讓我們試試吧:

  1. 不注意的時候你設置適配器setListAdapter(adapter);,該列表將設置它的適配器每個時間用戶做了onClick - 這是一種浪費。使用adapter.add()/adapter.remove()而不是通過重複執行setListAdapter來重置所有數據。
  2. 你叫list.invalidateViews(),爲了什麼?在你的情況下,adapter.notifyDataSetChanged()就足夠了。
+0

感謝您的建議,我會牢記在心。但主要的問題是刪除de DB中的最後一個元素,它只是有時候起作用,並且與所有其他元素完美協作。 – Jairo 2014-11-10 06:16:51

2

試試這個:對我來說工作正常。

ListView list; 
    adapter = new MyListAdapter(this); 
    list = (ListView) findViewById(android.R.id.list); 
    list.setAdapter(adapter); 
    list.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
     AlertDialog.Builder adb=new AlertDialog.Builder(MyActivity.this); 
     adb.setTitle("Delete?"); 
     adb.setMessage("Are you sure you want to delete " + position); 
     final int positionToRemove = position; 
     adb.setNegativeButton("Cancel", null); 
     adb.setPositiveButton("Ok", new AlertDialog.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       MyDataObject.remove(positionToRemove); 
       adapter.notifyDataSetChanged(); 
      }}); 
     adb.show(); 
     } 
    }); 
+0

事情是我需要從數據庫中刪除它,它沒有這樣做,但只有最後一個元素,並不總是。我希望你們中的任何一個人都能幫我解決我的代碼有什麼問題。 – Jairo 2014-11-10 06:11:53

相關問題