2011-01-04 26 views
8

Tôi đang sử dụng BaseAdapter tùy chỉnh để hiển thị các mục trên một ListView. Các mục chỉ là các chuỗi được giữ trong một ArrayList.Xóa các mục khỏi một ListView bằng cách sử dụng BaseAdapter tùy chỉnh

Các mục danh sách có nút xóa trên chúng (X lớn màu đỏ) và tôi muốn xóa mục khỏi ArrayList và thông báo cho ListView để cập nhật chính nó.

Tuy nhiên, mọi triển khai tôi đã thử đều nhận được số vị trí bí ẩn, vì vậy, ví dụ như nút xóa mục 2 sẽ xóa mục 5. Dường như nó gần như hoàn toàn ngẫu nhiên.

Một điều cần lưu ý là các thành phần có thể được lặp lại, nhưng phải được giữ theo cùng một thứ tự. Ví dụ, tôi có thể có "Irish" hai lần, như các yếu tố 3 và 7.

Mã của tôi là dưới đây:

private static class ViewHolder { 
     TextView lang; 
     int position; 
} 

public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.language_link_row, null); 
     holder = new ViewHolder(); 
     holder.lang = (TextView)convertView.findViewById(R.id.language_link_text); 
     holder.position = position; 

     final ImageView deleteButton = (ImageView) 
       convertView.findViewById(R.id.language_link_cross_delete); 
     deleteButton.setOnClickListener(this); 

     convertView.setTag(holder); 
     deleteButton.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.lang.setText(mLanguages.get(position)); 

    return convertView; 
} 

sau tôi cố gắng để lấy lại vị trí các yếu tố xóa bằng cách lấy thẻ, nhưng nó luôn luôn vị trí sai trong danh sách. Không có mô hình đáng chú ý đến vị trí được đưa ra ở đây, nó luôn luôn có vẻ ngẫu nhiên.

// The delete button's listener 
public void onClick(View v) { 

    ViewHolder deleteHolder = (ViewHolder) v.getTag(); 
    int pos = deleteHolder.position; 

    ... 
    ... 
    ... 
} 

Tôi rất vui khi chỉ xóa mục khỏi ArrayList và có bản cập nhật ListView, nhưng vị trí tôi nhận được không đúng nên tôi không thể làm điều đó. Xin lưu ý rằng tôi đã làm, lúc đầu, có clickButton clickListener bên trong phương thức getView, và sử dụng 'vị trí' để xóa giá trị, nhưng tôi đã có cùng một vấn đề.

Bất kỳ đề xuất nào được đánh giá cao, điều này thực sự gây khó chịu cho tôi.

Trả lời

5

Bạn phải đặt vị trí mỗi lần. Việc triển khai của bạn chỉ đặt vị trí khi tạo chế độ xem. Tuy nhiên khi xem được tái chế (khi convertView không phải là null), vị trí sẽ không được đặt thành giá trị chính xác.

public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.language_link_row, null); 
     holder = new ViewHolder(); 
     holder.lang = (TextView)convertView.findViewById(R.id.language_link_text); 

     final ImageView deleteButton = (ImageView) 
       convertView.findViewById(R.id.language_link_cross_delete); 
     deleteButton.setOnClickListener(this); 

     convertView.setTag(holder); 
     deleteButton.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.lang.setText(mLanguages.get(position)); 
    holder.position = position; 
    return convertView; 
} 
+1

Thật tuyệt vời, cảm ơn bạn. Không thể tin rằng tôi đã dành quá nhiều thời gian cho một vấn đề ngớ ngẩn như vậy. Tôi đã thêm giải pháp chung của tôi làm câu trả lời riêng cho những người quan tâm. – HXCaine

0

bạn cần triển khai giao diện OnItemClickListener và xóa mục trong phương thức onItemClick, một tham số của phương thức là vị trí.

+1

anh ấy có một nút, để người nghe sẽ không thích hợp. Trình lắng nghe đó chỉ hoạt động nếu toàn bộ phần tử danh sách nhận được sự kiện nhấp chuột. –

0

giải pháp cuối cùng của tôi là sử dụng câu trả lời chấp nhận bởi Greg và sau đây:

  • Store nắm giữ trong một HashMap, với các vị trí mục như các phím (điều này được khởi tạo như trống trong constructor)

    riêng HashMap mHolders;

  • Sử dụng này như là phương pháp OnClickListener:

public void onClick(View v) { 
    ViewHolder deleteHolder = (ViewHolder) v.getTag(); 
    int pos = deleteHolder.position; 
    mHolders.remove(pos);

ViewHolder currentHolder; 

    // Shift 'position' of remaining languages 
    // down since 'pos' was deleted 
    for(int i=pos+1; i<getCount(); i++){ 
     currentHolder = mHolders.get(i); 
     currentHolder.position = i-1; 
    } 
    mLanguages.remove(pos); 
    notifyDataSetChanged(); 
} 

[Xin tha cho các định dạng lạ. Việc nhúng mã không hoạt động đúng cách]

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