2011-01-11 42 views
9

Tôi đang cố gắng triển khai ListView với chức năng Xóa để xóa mục khỏi chế độ xem danh sách. Tôi thành công để xóa nhưng không làm mới listview sau khi xóa một mục từ cơ sở dữ liệu.Android - Chế độ xem danh sách xóa và Làm mới

Thực ra, hãy nhấp vào danh sách, tôi đang hiển thị AlertBox cho hành động "Xóa" và "Hủy", khi nhấp vào "Xóa", mục phải được xóa khỏi cơ sở dữ liệu và cũng như làm mới listview và listview. Tôi cũng đã sử dụng phương pháp notifyDataSetChanged().

lview = (ListView) findViewById(R.id.lview); 
adapter = new ListView_CustomAdapter(this, listitemDisplay); 
lview.setAdapter(adapter); 

lview.setOnItemClickListener(new OnItemClickListener() 
{ 
    @Override 
    public void onItemClick(AdapterView<?> a, View v, int position, long id) 
    { 
     Show_Alert_box(v.getContext(),"Please select action.",position); 
    } 
}); 

và mã cho Show_Alert_box:

public void Show_Alert_box(Context context, String message,int position) 
    { 
     final int pos = position; 

     final AlertDialog alertDialog = new AlertDialog.Builder(context).create(); 
      alertDialog.setTitle(getString(R.string.app_name_for_alert_Dialog)); 
      alertDialog.setButton("Delete", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 

        try 
        { 
         db.open(); 
           String[] whereArgs={String.valueOf(pkID)}; 
     return db.delete(DATABASE_TABLE_4,"pk_pkID == ?",whereArgs);  
         adapter.notifyDataSetChanged(); 
         db.close(); 
        } 
        catch(Exception e) 
        { 

        } 
      } }); 
      alertDialog.setButton2("Cancel", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        alertDialog.dismiss(); 
      } }); 

      alertDialog.setMessage(message); 
      alertDialog.show(); 
    } 
+0

Loại bộ điều hợp nào bạn đang sử dụng? Nếu bạn đang sử dụng CursorAdapter, những gì bạn mô tả sẽ hoạt động. – Juhani

+0

Mods không xóa câu hỏi vì bạn không hài lòng với câu trả lời, xin lỗi. – Will

Trả lời

9

Gọi Hoạt động đó một lần nữa Sử dụng Ý định

+0

Cuối cùng, tôi đã thực hiện giống như bạn đã đề cập. Thanx –

11

Liệu nó loại bỏ nó khỏi bộ chuyển đổi danh sách của bạn? Nếu không thì đó sẽ là lý do khiến notifyDataSetChanged() không làm bạn tốt.

Thực sự xem xét mã của bạn một lần nữa tôi chỉ có thể thấy rằng bạn đang xóa mã đó khỏi cơ sở dữ liệu chứ không phải chính bộ điều hợp.

chỉnh sửa (để trả lời nhận xét): Thật khó để thực hiện nếu không có lớp học ListView_CustomAdapter của bạn. Vấn đề là, trong bộ điều hợp này có bộ dữ liệu (bộ dữ liệu bạn đặt trong hàm tạo (listitemDisplay)) cũng cần được cập nhật. Chỉ khi đó notifyDataSetChanged() mới hoạt động.

+0

pls chỉ cho tôi cách mà tôi có thể thực hiện chức năng Xóa –

+0

Thực ra tôi đã thiết kế bộ điều hợp danh sách tùy chỉnh và do đó khi tôi cố gắng truy cập phương pháp "xóa" cho bộ điều hợp, nó không xuất hiện trong menu bật lên. –

5

nếu bạn có con trỏ, gọi requery() trước khi gọi notifyDataChanged()

0

Thử gọi refreshDrawableState nói danh sách để vẽ lại.

6

Tôi đoán rằng việc sử dụng

getActivity().recreate(); 

thay vì khởi động lại hoạt động thông qua một Ý định mới là tốt hơn bởi vì sử dụng một Ý định mới sẽ chỉ ngăn chặn các hoạt động hiện tại và không tiêu diệt nó.

Dù sao, nó hoạt động.

+0

Tìm kiếm điều này, hoạt động như một sự quyến rũ. Cảm ơn – Panache

4

tôi đã làm một cái gì đó như thế này trong bộ chuyển đổi của tôi:

((Activity)cxt).finish(); 
Intent intent = new Intent(cxt, YourActivity.class); 
cxt.startActivity(intent); 

này kết thúc hoạt động và sau đó bắt đầu một lần nữa cùng.

+0

câu trả lời hay nhất .... – himanshu

+0

nơi u nhận cxt? – Hoo

3

Tôi nghĩ thay vì gọi lại hoạt động, bạn nên đặt bộ điều hợp thành listview trên tùy chọn xóa hộp thoại sau khi nhận dữ liệu cập nhật từ cơ sở dữ liệu và đưa vào danh sách listitemDisplay như thế này.

alertDialog.setButton("Delete", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
       try 
       { 
        db.open(); 
          String[] whereArgs={String.valueOf(pkID)}; 
        return db.delete(DATABASE_TABLE_4,"pk_pkID == ?",whereArgs); 
        listitemDisplay = db.getItemFromDB(); 
        adapter = new ListView_CustomAdapter(this, listitemDisplay); 
        lview.setAdapter(adapter); 
        db.close(); 
       } 
       catch(Exception e) 
       { 

       } 
     } }); 

này sẽ làm mới ListView

+0

Điều này không hoạt động – AndroidHacker

3

Tôi có giải pháp:

Nếu bạn muốn xóa một hàng từ một click xem danh sách vào nút DELETE của mỗi hàng đó làm điều này. Ở đây bạn có một ví dụ về một lớp adapter tùy chỉnh với một tên và một nút xóa.Mỗi lần bạn nhấn nút hàng này sẽ bị xóa

public class UserCustomAdapter extends ArrayAdapter<User>{ 

Context context; 
int layoutResourceId; 
ArrayList<User> data = new ArrayList<User>(); 

public UserCustomAdapter(Context context, int layoutResourceId,ArrayList<User> data) { 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    UserHolder holder = null; 


    if (row == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     row = inflater.inflate(layoutResourceId, parent, false); 

     holder = new UserHolder(); 
     holder.textName = (TextView) row.findViewById(R.id.textView1); 
     holder.btnDelete = (Button) row.findViewById(R.id.button2); 
     row.setTag(holder); 
    } else { 
     holder = (UserHolder) row.getTag(); 

    } 

    User user = data.get(position); 


    holder.btnDelete.setTag(position); 
    holder.textName.setText(user.getName()); 



    holder.btnDelete.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      String pos = v.getTag().toString(); 
      int _posicion = Integer.parseInt(pos); 
      data.remove(_posicion); 
      notifyDataSetChanged(); 

     } 
    }); 

    return row; 


} 

static class UserHolder { 
    TextView textName; 
    Button btnDelete; 
} 
} 
0

Thực hiện một chức năng mới bên ngoài khối onCreate của bạn {một cái gì đó giống như ... getdata()} và bên trong chèn đó và nhận được tất cả dữ liệu của bạn và thiết lập để adapter.
Sau đó gọi lại hàm trong khối onResume() của bạn. Vì vậy, bất cứ khi nào bạn xóa dữ liệu khỏi danh sách, nó sẽ phản ánh ngay lập tức.

Các vấn đề liên quan