OnItemClickListener не дает индекс выбранного элемента

У меня есть setOnItemClickListener для AutoCompleteTextView, а в onItemClick я реализовал то, что должно произойти, на основе выбранного значения. Программа делает это, просматривая значение индекса выбранного элемента (в данном случае «int arg2»).

Вот код

 mCommCode = (AutoCompleteTextView) findViewById(R.id.CommCode);
 ArrayAdapter<String> mArrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line, CommodityCode);

   mCommCode.setAdapter(mArrayAdapter);

   mCommCode.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {

                double finalCommodityValue = 0;
                double argument = ((double)arg2);

                if(argument < 26){

                finalCommodityValue = argument + 1.00;

                } 

Единственная проблема в том, что значение int arg2 всегда равно 0, как видно при отладке. Кажется, существует разрыв между тем, что нажимается, и тем, что передается onItemClick.

Есть мысли как разобраться?


person RmK    schedule 11.09.2014    source источник


Ответы (2)


Я думаю, что ваша проблема с тем, что arg2 равен 0, заключается в том, что нет другого элемента для выбора, поскольку используемый вами объект представления (mCommCode) представляет собой текстовое представление, которое не может содержать список отдельных элементов для выбора. Эта роль выполняется с помощью объекта listView. я думаю, что это может решить ваши проблемы, если вы решите использовать представление списка для присоединения источника данных к:

mCommCode.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                    long id) {
                double finalCommodityValue = 0;
            double argument = ((double) position );

            if(argument < 26){

            finalCommodityValue = argument + 1.00;
            }
        });

Вы должны использовать объект listView, чтобы получить это право.

person Akah    schedule 11.09.2014
comment
Я думаю, тогда у меня нет другого выхода!! Я пытался избежать этого. Во всяком случае, позвольте мне продолжить с этим. Спасибо. - person RmK; 11.09.2014

В вашем коде может быть ошибка:

Вы переопределяете finalCommodityValue:

finalCommodityValue = 0;
if(argument < 26){

    double finalCommodityValue = argument + 1.00;

} 

Это ошибка компиляции, поскольку внутри функции не может быть более одной переменной с одинаковым именем.

Теперь, если переменная finalCommodityValue определена вне функции, содержащей приведенный здесь код, то вы затеняет< /а> это. Это означает, что finalCommodityValue внутри вашего оператора if (argument < 26) отличается от finalCommodityValue, который вы определили вне всей вашей функции. В некотором смысле это скрывает значение, определенное вне вашей функции.

Кроме того, создание переменной внутри оператора if приводит к тому, что она существует только в рамках оператора if (между {} ). Вы не используете его ни для чего в своем коде.

Я предполагаю, что у вас не было ошибки компиляции, поскольку вы можете отлаживать работу своего кода. Это означает, что finalCommodityValue определяется как поле класса. Таким образом, вам нужно удалить double:

finalCommodityValue = 0;
if(argument < 26){

    finalCommodityValue = argument + 1.00;

} 

Теперь finalCommodityValue в вашей функции и в операторе if соответствует одному и тому же finalCommodityValue, определенному глобально в вашем классе.

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

mCommCode = (AutoCompleteTextView) findViewById(R.id.CommCode);

Вы используете OnItemClickListener в AutoCompleteTextView. AutoCompleteTextView — это TextView, поэтому он имеет только один элемент. Вот почему вы всегда получаете позицию 0. Вместо этого вам нужно использовать ListView.

В вашем XML-файле у вас должно быть что-то вроде этого:

<AutoCompleteTextView
    android:id="@+id/tvAutocomplete"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="15"
    android:hint="@string/search_hint" >

    <requestFocus />
</AutoCompleteTextView>

<ListView
    android:id="@+id/lvDataList"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="85" >
</ListView>

Далее создайте переменную класса:

ListView searchList;

И в onCreate():

searchList = (ListView) findViewById(R.id.lvDataList);

Затем в функции, содержащей показанный здесь код, поместите OnItemClickListener на ListView, а не на AutoCompleteTextView:

searchList.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapter, View view, int position,
                long id) {

            Log.d("POSITION", position);

            // .. Rest of your code

        }

    });
person nem035    schedule 11.09.2014
comment
Спасибо, что указали на ошибку. Я отредактировал свой вопрос. Любые мысли о том, почему полученное значение int arg2 равно 0 независимо от того, какой выбор я делаю? - person RmK; 11.09.2014
comment
Откуда вы знаете, что arg2 равен 0? Как вы это тестировали? Вы поставили точку останова и отладили ее? Чего ваш код пытается достичь? - person nem035; 11.09.2014
comment
Я очень ценю время и детали, которые вы дали при ответе на вопрос, но позвольте мне указать на пару вещей: 1. finalCommodityValue не используется после завершения onClickListener, и поэтому я не объявил его глобальным. 2. Есть причина, по которой я использовал AutoCompleteTextView, и я считаю, что listview не сможет решить эту проблему. (Пример использования здесь - в EditText, когда я печатаю, должны появляться предложения.) - person RmK; 11.09.2014
comment
если бы finalCommodityValue не была глобальной переменной класса, то ваш код до предложенного мной исправления не смог бы работать. У вас будет ошибка компиляции, если вы скажете finalCommodityValue = 0 без типа double. Это означает, что вы никогда не сможете даже приступить к отладке значений времени выполнения, потому что компилятор не позволит вам работать. Поэтому вы не сможете сказать, равно ли arg2 0. Я не уверен, что не так с вашим кодом, но я также не уверен, что что-то не так. Вы никогда не говорили, чего вы пытаетесь достичь, и откуда вы знаете, что аргумент позиции всегда равен 0. - person nem035; 11.09.2014
comment
Чтобы прояснить ваши сомнения, я объявил переменную как двойную внутри прослушивателя onClick в случае кода, который копируется только для того, чтобы люди его поняли. Я не хотел пропускать весь код. Что касается компилятора, позволяющего мне запускать код, поверьте мне на слово, у меня есть отладчик, который извлекает для меня все данные. На самом деле @larrytech прекрасно изложил то, что только что произошло. В любом случае, спасибо за ваше время. - person RmK; 11.09.2014
comment
@RmK Я уверен, что вы запустили код, я просто ухожу от того, что вижу здесь. Кстати, мой ответ был таким же, как и у larrytech :) Я также сказал вам, что вам нужно использовать ListView :) Посмотрите на предыдущее редактирование моего ответа. - person nem035; 11.09.2014