Как динамически удалять элементы из ListView одним нажатием кнопки? - PullRequest
16 голосов
/ 31 марта 2011

Я работаю над приложением, которое требует удаления элементов из ListView для события кнопки.

Я попытался удалить его из ArrayList, создать новый адаптер и снова загрузить список.Поскольку мой список огромен, это повлияет на производительность моего приложения.Поэтому мне было интересно, есть ли другой способ, с помощью которого я могу динамически удалить элемент из своего списка.

Редактировать: Я попробовал то, что вы сказали.

Когда я удалил один элемент, он работал отлично, но когда я увеличивал количество выбранных элементов, он начинал давать мне IndexOutOfBoundException.

Вот мой код:

public void onClick(View view)
{
    SparseBooleanArray checkedPositions = new SparseBooleanArray();
    checkedPositions.clear();
    checkedPositions = lv.getCheckedItemPositions();
    int size = checkedPositions.size();
    if(size != 0)
    {

        for(int i = 0; i <= size; i++)
        {
            if(checkedPositions.valueAt(i))
            {
                list.remove(notes.getItem(checkedPositions.keyAt(i)));
                notes.notifyDataSetChanged();
            }
        }
    }
        else{}
}

Здесь, notes является ссылкой на объект SimpleAdapter.

Ответы [ 9 ]

49 голосов
/ 31 марта 2011

Ну, вы просто удаляете нужный элемент из списка, используя метод remove() вашего ArrayAdapter.

Возможный способ сделать это будет:

Object toRemove = arrayAdapter.getItem([POSITION]);
arrayAdapter.remove(toRemove);

Другим способом было бы изменить ArrayList и вызвать notifyDataSetChanged() на ArrayAdapter.

arrayList.remove([INDEX]);
arrayAdapter.notifyDataSetChanged();
5 голосов
/ 23 сентября 2012

Это сработало для меня. Надеюсь, это кому-нибудь поможет. :)

SimpleAdapter adapter = (SimpleAdapter) getListAdapter();
this.resultsList.remove((int) info.id);
adapter.notifyDataSetChanged();
4 голосов
/ 31 марта 2011
adapter.remove(arraylist.get(position));
adapter.notifyDataSetChanged();

или вы можете позвонить снова

setListAdapter(adapter)
2 голосов
/ 18 апреля 2012

Имейте кнопку в списке и позволяйте ей щелкать по функции в xml, например, чтобы получить позицию первым

public void OnClickButton(View V){
  final int postion = listView.getPositionForView(V);
    System.out.println("postion selected is : "+postion);
Delete(postion);

}
public void Delete(int position){
    if (adapter.getCount() > 0) {

        //Log.d("largest no is",""+largestitemno);
        //deleting the latest added by subtracting one 1 
        comment = (GenrricStoring) adapter.getItem(position);
        //Log.d("Deleting item is: ",""+comment);
        dbconnection.deleteComment(comment);
        List<GenrricStoring> values = dbconnection.getAllComments();
        //updating the content on the screen
        this.adapter = new UserItemAdapter(this, android.R.layout.simple_list_item_1, values);
        listView.setAdapter(adapter);
    }
    else
    {
        int duration = Toast.LENGTH_SHORT;
        //for showing nothing is left in the list
        Toast toast = Toast.makeText(getApplicationContext(),"Db is empty", duration);
        toast.setGravity(Gravity.CENTER, 0, 0);

        toast.show();
    }

}
1 голос
/ 17 октября 2016
      private List<DataValue> datavalue=new ArrayList<Datavalue>;

     @Override
    public View getView(int position, View view, ViewGroup viewGroup) {

            view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                datavalue.remove(position);
                notifyDataSetChanged();
            }
        });
    }
    }
0 голосов
/ 18 июля 2015

Что касается вашего последнего вопроса, вот проблема, проиллюстрированная на простом примере:

Допустим, ваш список содержит 5 элементов: list = [1, 2, 3, 4, 5], а список элементов для удаления (т. Е. Индексы) - indices_to_remove = [0, 2, 4]. На первой итерации цикла вы удаляете элемент с индексом 0, поэтому ваш список становится list = [2, 3, 4, 5]. Во второй итерации вы удаляете элемент с индексом 2, поэтому ваш список становится list = [2, 3, 5] (как вы можете видеть, это удаляет неправильный элемент). Наконец, в третьей итерации вы пытаетесь удалить элемент с индексом 4, но список содержит только три элемента, поэтому вы получаете исключение вне границ.

Теперь, когда вы видите, в чем проблема, надеюсь, вы сможете найти решение. Удачи!

0 голосов
/ 29 мая 2015

Вы можете удалить элемент из списка следующим образом: или вы можете выбрать в событии кнопки, какой элемент должен быть удален

public class Third extends ListActivity {
private ArrayAdapter<String> adapter;
private List<String> liste;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_third);
     String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
                "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                "Linux", "OS/2" };
     liste = new ArrayList<String>();
     Collections.addAll(liste, values);
     adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, liste);
     setListAdapter(adapter);
}
 @Override
  protected void onListItemClick(ListView l, View v, int position, long id) {
     liste.remove(position);
     adapter.notifyDataSetChanged();
  }
}
0 голосов
/ 07 февраля 2015
 List<String> entries;
 private ArrayAdapter<String> categoryAdapter;
 //Your list of entries {Example: <"category1","category2","category3">}
 entries =  new ArrayList<String>();
 categoryAdapter = new ArrayAdapter<String>(ViewBeaconsActivity.this,
                                   android.R.layout.simple_list_item_1, entries);
 //Remove that specific category from the list
 entries.remove(categoryName);
 //Notify the adapter that your dataset has changed.
 categoryAdapter.notifyDataSetChanged();
0 голосов
/ 28 августа 2014
<ImageView
    android:id="@+id/btnDelete"
    android:layout_width="35dp"
    android:layout_height="match_parent"
    android:layout_alignBottom="@+id/editTipo"
    android:layout_alignParentRight="true"
    android:background="@drawable/abc_ic_clear"
    android:onClick="item_delete_handler"/>

И создать событие item_delete_handler ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...