2014-11-08 4 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 –

답변

0

매개 변수 값으로 pos = 3을 전달했다고 가정했습니다.

가 기억리스트 뷰의 인덱스를 시작하고 어댑터가 다른 : 목록의 크기가 3이기 때문에, 마지막 요소의 위치는 2

이 * 편집해야합니다. ListView 항목 pos는 첫 번째 위치로 "1"부터 시작하여 배열 (예 : 배열)은 인덱스 "0"부터 첫 번째 위치로 시작합니다.

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

나는 항목 위치가 0에서 시작한다고 확신한다. 나는 유사한 코드를 사용했고, flawlesly로 작업했다. 게다가 당신이 선택한 요소를 삭제하지 않을 것이다. 또한 나는 그것이 ArrayIndexOutOfBoundsException 또는 이와 비슷한 것을 줄 것이라고 생각한다. – Jairo

0

코드에 실수가 있습니다. 내 다음과 같은 제안 해달라고 약속을 시도해 현재의 문제를 해결하지만, 할 수 있습니다 것입니다 : - 낭비

  1. 에주의를 당신이 어댑터 setListAdapter(adapter);를 설정할 때, 목록 시간 사용자가 onClick했던 그 어댑터를 설정합니다. setListAdapter을 반복하여 수행하여 모든 데이터를 재설정하는 대신 adapter.add()/adapter.remove()을 사용하십시오.
  2. list.invalidateViews()에 전화하셨습니까? 귀하의 경우에는 adapter.notifyDataSetChanged()이면 충분합니다.
+0

조언을 주셔서 감사합니다, 나는 그것을 명심할 것입니다. 하지만 주요 문제는 DB에서 마지막 요소를 삭제하는 것입니다.이 작업은 가끔씩 만 작동하며 다른 모든 요소와 완벽하게 작동합니다. – Jairo

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