2016-11-02 5 views
0

Я создал ListView, в котором я показываю некоторые записи из базы данных. Когда кто-то нажимает элемент из ListView, мне нужно, чтобы этот элемент полностью удалялся из ListView. Если я использую view.setVisibility(View.GONE); или view.setVisibility(View.INVISIBLE);, текст исчезает. Мне нужен весь элемент, который нужно удалить. Я использую интерфейс ListAdapter вместо класса SimpleAdapter.Как удалить элемент из списка ListView программно в Android?

Как я могу это сделать? Вот мой код:

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, showProductsUrl, new Response.Listener<JSONObject>() { 
@Override 
public void onResponse(JSONObject response) { 
    try { 
     JSONArray jsonArray = response.getJSONArray("products"); 

     for (int i = 0; i < jsonArray.length(); i++) { 
      JSONObject jsonObject = jsonArray.getJSONObject(i); 
      final String productId = jsonObject.getString("id"); 
      final String productName = jsonObject.getString("productName"); 
      HashMap<String, String> product = new HashMap<>(); 
      product.put(ID, productId); 
      product.put(PRODUCT_NAME, productName); 
      productList.add(product); 

      String[] from = {ID, PRODUCT_NAME}; 
      int[] to = {R.id.id, R.id.productName}; 

      ListAdapter adapter = new SimpleAdapter(getApplicationContext(), productList, R.layout.list_products_to_buy, from, to); 

      ListView listView = (ListView) findViewById(R.id.listView); 
      listView.setAdapter(adapter); 
      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        view.setVisibility(View.GONE); 
       } 
      }); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

}

Заранее спасибо!

+1

Вы должны удалить элемент из адаптера. – Alex

+0

Вы храните продукты в «productList». Вы должны удалить элемент, который хотите удалить из этого списка, и вызвать adapter.notifyDataSetChanged(). –

+0

Возможный дубликат [Как динамически удалять элементы из списка ListView при нажатии кнопки?] (Http://stackoverflow.com/questions/5497580/how-to-dynamically-remove-items-from-listview-on-a-button -click) – Selvin

ответ

0
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, showProductsUrl, new Response.Listener<JSONObject>() { 
@Override 
public void onResponse(JSONObject response) { 
    try { 
     JSONArray jsonArray = response.getJSONArray("products"); 

     for (int i = 0; i < jsonArray.length(); i++) { 
      JSONObject jsonObject = jsonArray.getJSONObject(i); 
      final String productId = jsonObject.getString("id"); 
      final String productName = jsonObject.getString("productName"); 
      HashMap<String, String> product = new HashMap<>(); 
      product.put(ID, productId); 
      product.put(PRODUCT_NAME, productName); 
      productList.add(product); 

      String[] from = {ID, PRODUCT_NAME}; 
      int[] to = {R.id.id, R.id.productName}; 

      //NOTE: See I changed it to SimpleAdapter so you can call the notifydatasetchanged method after removing the element from the list. 
      SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(), productList, R.layout.list_products_to_buy, from, to); 

      ListView listView = (ListView) findViewById(R.id.listView); 
      listView.setAdapter(adapter); 
      listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        productList.remove(position); 
        adapter.notifyDataSetChanged(); 
       } 
      }); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Это сработало для меня. Большое вам спасибо, это решило мою проблему! –

0
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       productList.remove(position); 
       listView.getAdapter().notifyDataSetChanged(); 
      } 
     }); 
+1

Очевидно, что не будет работать при использовании фильтров (fx с ArrayAdapter) ... поскольку позиция в отфильтрованном списке не поместилась бы в нефильтрованном списке ... (поэтому мы не должны также использовать 'productList.get (position)', но скорее 'parent.getItem (position)' in 'onItemClick') – Selvin

+0

Я попытался использовать' listView.getAdapter(). notifyDataSetChanged(); 'но не работает. Ошибка: 'Ошибка: (109, 54) ошибка: не удается найти метод символа notifyDataSetChanged()' –

+0

@AlexM. пройдите обновленный ответ. –

0

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

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

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

Я люблю пиратов/воров ... точную копию [этого] (http://stackoverflow.com/questions/5497580/how-to-dynamically-remove-items-from-listview-on-a-button-click# answer-5497639) ... ** у вас достаточно репутации, чтобы отметить вопрос как дубликат **, почему вы копируете ответ? – Selvin

+0

К сожалению, это не работает в моем случае. Есть ли у вас другая идея? –

Смежные вопросы