Удаление элементов из ListView с помощью контекстного меню в Android?

1

Я пытаюсь сделать приложение listmanager в Android. Я создал ListView и ArrayList, в которые я могу добавлять элементы с помощью кнопки и EditText. Затем я создал контекстное меню с xml файлом, в котором я могу удалить список, добавить новые, отредактировать их и т.д. Проблема в том, что я не знаю, как удалить мои элементы в методе onContextItemSelected() моего контекстного меню. Точнее, я не знаю, как ссылаться на список внутри этого метода, то же самое со всеми другими операциями, но я надеюсь, что смогу сделать их, когда мне удастся с удалением. (Извините за мой плохой английский, это было время, так как я правильно использовал его :) :)

Вот мой main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:layout_above="@+id/linear"
    android:layout_weight="1"
    android:background="#000000"
    android:drawSelectorOnTop="true" />

<LinearLayout 
    android:id="@+id/linear"
    android:layout_alignParentBottom="true"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:orientation="horizontal">
    <EditText
        android:id="@+id/entry"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_weight="1"/>
    <Button
        android:text="Hozzáad"
        android:id="@+id/bHozzaad"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>
</RelativeLayout>

Вот мой contextmenu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/editItem"
      android:title="edit"/>

<item android:id="@+id/markItem"
      android:title="mark" />

<item android:id="@+id/deleteItem"
      android:title="delete" />

<item android:id="@+id/permItem"
      android:title="permanently delete" />

<item android:id="@+id/copyItem"
      android:title="copy" />

<item android:id="@+id/moveItem"
      android:title="move"/>
</menu>

И вот моя главная java:

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  final ArrayList<String> listaelemek = new ArrayList<String>();

  final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, listaelemek);
  setListAdapter(adapter);
  adapter.add("first item");

  setContentView(R.layout.main);

  ListView lv = getListView();
  lv.setTextFilterEnabled(true);
  registerForContextMenu(lv);   

  lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {}
  });

  final Button hozzaad = (Button) findViewById(R.id.bHozzaad);
  hozzaad.setOnClickListener(new View.OnClickListener() 
        {
      public void onClick(View v) 
            {
            EditText entry = (EditText) findViewById(R.id.entry);
            listaelemek.add(entry.getText().toString());
            adapter.notifyDataSetChanged();
            }
        }
  );
}

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}

@Override
public void onCreateContextMenu(android.view.ContextMenu menu, View v, ContextMenuInfo menuInfo)    
{
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.contextmenu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
 case R.id.editItem:
//do something 
return true;
 case R.id.markItem:
//do something
 return true;
 case R.id.deleteItem:
//here my question mark :)
 return true;
 case R.id.permItem:
//do something
return true;
case R.id.copyItem:
//do something
return true;
case R.id.moveItem:
//do something
return true;
default:
return super.onContextItemSelected(item);
}
}

Надеюсь, ты поможешь мне :)

Теги:
arraylist
listview
menu
contextmenu

2 ответа

11

Этот код должен выполнять эту работу:

adapter.remove(adapter.getItem(info.position));
  • 0
    благодарю вас! но теперь есть ошибка: «Метод remove (MenuItem) не определен для типа Menu». может быть, я должен поместить объявление адаптера вне публичного метода void onCreate (...), чтобы onContextItemSelected () мог получить к нему доступ?
  • 0
    @ user1281948, конечно, адаптер должен быть виден, лучше сделайте его переменной класса.
Показать ещё 2 комментария
1

Я написал выше код адаптера в своей программе, когда я запускаю программу и удаляю элемент, используя контекстное меню, в это время появляется окно с принудительным закрытием

это мой код

public class ShowContextMenu расширяет ListActivity {

ArrayAdapter<String> adapter;



/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

   final String []s=(getResources().getStringArray(R.array.names));

   final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,s);

    setListAdapter(adapter);


    registerForContextMenu(getListView());
}

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);
}






public boolean onContextItemSelected(MenuItem item) {
    AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

    String[] names = getResources().getStringArray(R.array.names);

    switch(item.getItemId()) {

    case R.id.edit:
        Toast.makeText(this, "You have chosen the " + getResources().getString(R.string.edit) + 
                " context menu option for " + names[(int)info.id],                          
                Toast.LENGTH_SHORT).show();



        return true;

    case R.id.save:
        Toast.makeText(this, "You have chosen the " + getResources().getString(R.string.save) + 
                " context menu option for " + names[(int)info.id],
                Toast.LENGTH_SHORT).show();
        return true;

    case R.id.delete:

//вставляем код здесь

adapter.remove(adapter.getItem(info.position));


        Toast.makeText(this, "You have chosen the " + getResources().getString(R.string.delete) + 
                " context menu option for " + names[(int)info.id],
                Toast.LENGTH_SHORT).show();

        return true;

    case R.id.view:

        Toast.makeText(this, "You have chosen the " + getResources().getString(R.string.view) + 
                " context menu option for " + names[(int)info.id],
                Toast.LENGTH_SHORT).show();
        return true;
    default:
        return super.onContextItemSelected(item);
    }
}

}

  • 0
    выдает ошибку ... индекс выходит за границы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню