2010-09-08 2 views
1

У меня есть один экран с банком кнопок ниже ListView. Записи в ListView загораются оранжевым цветом при прокрутке, поэтому я предполагаю, что они выбраны. Когда я затем нажимаю кнопку «Удалить», я хочу, чтобы onClickListener удалил текущую выбранную запись. Но getSelectedItemPosition() всегда дает мне -1. Если я не могу надеяться использовать элементы управления графическим интерфейсом таким образом, пожалуйста, дайте мне другой способ получить тот же результат.Как метод нажатия кнопки узнает, какой элемент выбран в ListView?

Я даже попробовал установить onClickListener в виде списка, чтобы сохранить индекс перед нажатием кнопки (в случае, если нажатие кнопки отменяет выбор записи), но даже это всегда -1 кажется.

Вот код (без модификации, которая не работала)

package com.bayley; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import java.util.ArrayList; 

/** 
* 
* @author p0074564 
*/ 
public class September extends Activity { 

/** Called when the activity is first created. */ 


@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 

    final ListView myListView = (ListView) findViewById(R.id.myListView); 
    Button addButton = (Button) findViewById(R.id.AddButton); 
    Button deleteButton = (Button) findViewById(R.id.DeleteButton); 
    final EditText editText = (EditText) findViewById(R.id.myEditText); 

    final ArrayList<String> todoItems = new ArrayList<String>(); 
    todoItems.add("Monday"); 
    todoItems.add("Tuesday"); 
    todoItems.add("Wednesday"); 

    final ArrayAdapter<String> aa = 
    new ArrayAdapter<String>(this, 
    android.R.layout.simple_list_item_1, todoItems); 
    myListView.setAdapter(aa); 

    addButton.setOnClickListener(new 
    Button.OnClickListener() { 
    public void onClick(View v) { 
    todoItems.add(editText.getText().toString()); 
    aa.notifyDataSetChanged(); 
    } 
    }); 


    deleteButton.setOnClickListener(new 
    Button.OnClickListener() { 
    public void onClick(View v) { 
    // always returns -1 unfortunately ie nothing is ever selected 
    int index = myListView.getSelectedItemPosition(); 
    if (index >= 0) { 
    todoItems.remove(index); 
    } 
    aa.notifyDataSetChanged(); 
    } 
    }); 



} 
} 
+0

Вы уверены, что этот пункт действительно выбран. Я думаю, что это может быть только сфокусировано. – Flo

+0

ОК, возможно, вы правы. Он подсвечивается оранжевым цветом. Я думал, это означает, что он был выбран. Возможно, я ошибаюсь в своем словаре. Подумайте об этом, возможно, его нужно дважды щелкнуть, чтобы его можно было выбрать, но затем щелчок на кнопке отменит его выбор. Есть ли способ узнать, какой предмет сосредоточен? Или если нажатие кнопки «Удалить» теряет фокус, возможно, я могу переопределить событие onFocus, чтобы сохранить фокусный индекс? –

+0

Существует интерфейс OnFocusChangedListener, но я не знаю, можете ли вы прикрепить этот прослушиватель к элементам списка, но я думаю, что должно быть возможно каким-то образом. Но это может не помочь вам, потому что фокус будет потерян при нажатии кнопки. Для двух других способов справиться с вашей проблемой рассмотрите мой ответ ниже. – Flo

ответ

0

Как я уже упоминал в своем комментарии я не знаю, если вы можете прикрепить OnFocusChangedListener к элементам списка, но Я почти уверен, что это возможно, хотя, хотя это вам действительно не поможет.

Возможно, вам понравится оба варианта ниже.

  1. Внесите контекстное меню пункта, которое появляется, когда вы долго нажимаете на элемент. В этом контекстном меню вы можете указать действие удаления. Вы увидите это поведение во многих различных приложениях Android, которые обрабатывают некоторые списки. Посмотрите на это blog post.

  2. Сделайте список подходящим для выбора нескольких элементов. См. this question для получения дополнительной информации. Таким образом вы можете удалить сразу несколько элементов.

0

я некоторые, что модифицированный код ур .. его работы

public class Selectlistitem extends Activity { 
    int pos; 

/** Called when the activity is first created. */ 


@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 

    final ListView myListView = (ListView) findViewById(R.id.widget34); 
    Button addButton = (Button) findViewById(R.id.btnadd); 
    Button deleteButton = (Button) findViewById(R.id.btnremove); 
    final EditText editText = (EditText) findViewById(R.id.txt1); 

    final ArrayList<String> todoItems = new ArrayList<String>(); 
    todoItems.add("Monday"); 
    todoItems.add("Tuesday"); 
    todoItems.add("Wednesday"); 

    final ArrayAdapter<String> aa = 
    new ArrayAdapter<String>(this, 
    android.R.layout.simple_list_item_1, todoItems); 
    myListView.setAdapter(aa); 

    addButton.setOnClickListener(new 
    Button.OnClickListener() { 
    public void onClick(View v) { 
    todoItems.add(editText.getText().toString()); 
    aa.notifyDataSetChanged(); 
    } 
    }); 

myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    public void onItemClick(AdapterView<?> list, View v, int pos, long id) { 
     aa.getItem(pos); 
     editText.setText(""+pos); 
    } 
}); 
    deleteButton.setOnClickListener(new 
    Button.OnClickListener() { 
    public void onClick(View v) { 
    // always returns -1 unfortunately ie nothing is ever selected 
// int index = myListView.getCheckedItemPosition(); 
     int index=pos; 
    if (index >= 0) { 
    todoItems.remove(index); 
    } 
    editText.setText(""+index); 
    aa.notifyDataSetChanged(); 
    } 
    }); 



} 
} 
+0

Большое спасибо. Я думаю, что вместо OnItemClickListener я использовал OnClickListener. Я был очень удивлен тем, что нажатие клавиши со стрелкой вызывает событие «item click» в элементе, в который он перемещается. Единственная оставшаяся небольшая проблема заключается в том, что я хотел бы, чтобы элемент оставался оранжевым, когда я нажимаю на него, чтобы я знал, какой элемент будет удален, если я должен нажать delete. Я думал, что возможно myListView.setItemChecked (pos, true); (inItemClick) дал бы мне это, но это не так. Любые идеи, пожалуйста? –

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