2014-10-24 2 views
0

У меня есть список строк.Удалить удаленный предмет из списка

Я хочу удалить удаленный предмет.

В приведенном ниже коде элемент удален в db (подтверждение и повторное открытие подтверждают это).

Вот где я хочу удаленный элемент удален

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    // TODO Auto-generated method stub 
    int menuItemIndex = item.getItemId(); 
    final AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo(); 
    final int pos = menuInfo.position; 
     String menuItemName =menuItems[menuItemIndex]; 
    if(menuItemName=="Delete") 
    { 
     try{ 
     Locations l= (Locations)locations.get(pos); 
     int id= l.get_id(); 
     if(db.deleteLocation(id)) 
     { 
     locations.remove(pos); 
     arrayAdapter.notifyDataSetChanged(); 
     }else 
     { 
      Toast.makeText(this,"Can not delet a location with apartment blocks",Toast.LENGTH_LONG).show(); 
     } 

     }catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    return super.onContextItemSelected(item); 
} 

Этот код для всей деятельности.

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

package com.example.metermanager; 

import java.util.ArrayList; 
import java.util.List; 

import meter.manager.helper.DatabaseHelperClass; 
import meters.model.Locations; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.ContextMenu; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ContextMenu.ContextMenuInfo; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 
import android.widget.AdapterView.AdapterContextMenuInfo; 

public class ApartmentLocations extends Activity { 
    private DatabaseHelperClass db; 
    private List<Locations> locations= new ArrayList<Locations>(); 
    String[] menuItems = {"Delete"}; 
    ArrayAdapter<String> arrayAdapter ; 
    ListView list; 
@Override 

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.appartment_locations); 
    db= DatabaseHelperClass.getInstance(this); 
    list= (ListView) findViewById(R.id.apartments_locations); 
    locations=db.GetLocations(); 
    List <String> s = new ArrayList<String>(); 

    for (Locations l:locations){ 
     s.add(l.toString()); 
    } 
    arrayAdapter = new ArrayAdapter<String>(
      this, 
      android.R.layout.simple_list_item_1, 
      s); 

    list.setAdapter(arrayAdapter); 
    registerForContextMenu(list); 
} 
@Override 
public void onCreateContextMenu(ContextMenu menu, View v, 
     ContextMenuInfo menuInfo) { 
    if (v.getId()==R.id.apartments_locations) {  
     menu.setHeaderTitle("Choose a menu item");    
     for (int i = 0; i<menuItems.length; i++) { 
      menu.add(Menu.NONE, i, i, menuItems[i]); 
     } 
} 
} 
@Override 
public boolean onContextItemSelected(MenuItem item) { 
    // TODO Auto-generated method stub 
    int menuItemIndex = item.getItemId(); 
    final AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo(); 
    final int pos = menuInfo.position; 
     String menuItemName =menuItems[menuItemIndex]; 
    if(menuItemName=="Delete") 
    { 
     try{ 
     Locations l= (Locations)locations.get(pos); 
     int id= l.get_id(); 
     if(db.deleteLocation(id)) 
     { 
     locations.remove(pos); 
     arrayAdapter.notifyDataSetChanged(); 
     }else 
     { 
      Toast.makeText(this,"Can not delet a location with apartment blocks",Toast.LENGTH_LONG).show(); 
     } 

     }catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    return super.onContextItemSelected(item); 
} 
} 

Любые подсказки?

Ronald

+1

возможно дубликат [? Как сравнить строки в Java] (http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – Nabin

+0

Вызов 'arrayAdapter.notifyDataSerChanged()' предполагает, что вы сами обновляете список данными. Адаптер просто снова рисует представления. Другими словами, перезагрузите список из базы данных после удаления элемента. –

+1

if (menuItemName == "Удалить") до if (menuItemName.equals ("Удалить")) – Nabin

ответ

1

Вы можете использовать две вещи для этой работы:

  1. Когда вы используете arrayAdapter.notifyDataSetChanged();, тогда он работает только тогда, когда данные (список), передаваемые в адаптере, обрабатываются. поэтому перед использованием этого вы удалите данные из переданного arraylist в вашем случае, что s (список).

Так что вы должны объявить переменную список ы глобально, а затем удалить элемент, когда это необходимо, как:

 locations.remove(pos); 
    s.remove(pos); 
    arrayAdapter.notifyDataSetChanged(); 

ИЛИ 2. Вы можете использовать SimpleCursorAdapter, который Сюита в вашем контексте
http://developer.android.com/reference/android/widget/SimpleCursorAdapter.html

А также, я нашел еще одну ошибку:
if(menuItemName=="Delete")
мы не можем сравнивать строки в Java, как это так плз изменить его следующим образом:
if(menuItemName.equals("Delete"))

+0

Возможно, я попробую простой адаптер курсора ... но мой метод превратил Arraylist. .. – user3079559

+0

Вы пытались удалить данные из списка массивов s, а затем вызвать метод уведомления? и s должны быть глобальными. –

+1

внесло поправки об равных. Спасибо! – user3079559

0

просто добавить locations.clear() после notifydatasetchanged() в Уре деятельности, где команда удаления выполнена

+0

не работает ... список не обновлен. – user3079559

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