Pertanyaan acara pemicu spinner android saat pemilihan item yang sama dibuat


Saya ingin memecat acara ketika item yang sama dipilih dalam spinner. metode

@Override
    public void onItemSelected(AdapterView<?> parent, View arg1, int position,
            long arg3) {
    }

hanya dipanggil ketika kami seleksi yang berbeda dibuat. Tujuan saya adalah untuk menampilkan bersulang ketika item apa pun dipilih baik item yang sama dipilih kembali atau seleksi yang berbeda dibuat.

@Override
    public void onNothingSelected(AdapterView<?> parent) {

    }

metode diatas tidak menyelesaikan masalah saya.


10
2018-01-20 05:32


asal


Jawaban:


gunakan pendengar klik untuk memenuhi kebutuhan Anda. sebagai pendengar klik langsung pada spinner tidak didukung sehingga membuat kelas memperpanjang spinner dan lebih dari metode naik di klik dan dalam metode ini lakukan apa yang ingin Anda lakukan.


0
2018-01-20 09:04



Saya telah menemukan bahwa seleksi lama disimpan pada variabel yang disebut mOldSelectedPosition dalam hirarki spinner. Spinner menggunakan nilai ini untuk memeriksa apakah barang yang sama dipilih atau tidak, dan jika itu sama, itu mengabaikan. Jika kita tidak ingin mengabaikan ini Apa yang saya lakukan adalah beberapa kode kotor menggunakan refleksi.

package com.aradiom.amc.nativecomponents;

import java.lang.reflect.Field;

import android.content.Context;
import android.util.Log;
import android.widget.Spinner;

public class SpinnerTrigger extends Spinner {

public SpinnerTrigger(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

@Override
public void setSelection(int position, boolean animate) {
    ignoreOldSelectionByReflection();
    super.setSelection(position, animate);
}

private void ignoreOldSelectionByReflection() {
    try {
        Class<?> c = this.getClass().getSuperclass().getSuperclass().getSuperclass();
        Field reqField = c.getDeclaredField("mOldSelectedPosition");
        reqField.setAccessible(true);
        reqField.setInt(this, -1);
    } catch (Exception e) {
        Log.d("Exception Private", "ex", e);
        // TODO: handle exception
    }
}

@Override
public void setSelection(int position) {
    ignoreOldSelectionByReflection();
    super.setSelection(position);
}

}

Kelas ini akan selalu membatalkan nilai oldselection, sehingga setiap kali peristiwa klik dipicu. Ini mungkin bukan solusi sempurna. Gunakan dengan hati-hati. :)


18
2017-12-01 18:30



Semoga ini membantu. Saya mencoba dan berhasil

/** Spinner extension that calls onItemSelected even when the selection is the same as its previous value */
    public class NDSpinner extends Spinner {

      public NDSpinner(Context context)
      { super(context); }

      public NDSpinner(Context context, AttributeSet attrs)
      { super(context, attrs); }

      public NDSpinner(Context context, AttributeSet attrs, int defStyle)
      { super(context, attrs, defStyle); }

      @Override public void
      setSelection(int position, boolean animate)
      {
        boolean sameSelected = position == getSelectedItemPosition();
        super.setSelection(position, animate);
        if (sameSelected) {
          // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
          getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
        }
      }

      @Override public void
      setSelection(int position)
      {
        boolean sameSelected = position == getSelectedItemPosition();
        super.setSelection(position);
        if (sameSelected) {
          // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
          getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());
        }
      }
    }

6
2017-08-25 02:17



Karena reputasi saya tidak cukup tinggi untuk berkomentar langsung pada jawaban @Suat, saya mencoba metode itu, itu bekerja seperti pesona, tetapi saya tidak jelas apa efek sampingnya. Sesuatu yang ingin saya tambahkan adalah, konstruktor tambahan harus ditambahkan untuk menghindari kesalahan.

public SpinnerTrigger(Context context, AttributeSet attrs, int defStyle)
{ super(context, attrs, defStyle); }

public SpinnerTrigger(Context context, AttributeSet attrs){
super(context,attrs);

}


3
2017-09-10 02:29



Anda dapat menambahkan nama metode pada METODE yang dipilih item Anda

Spinner `Spinner1`=(Spinner)findViewById(R.id.`declareid`)

oBject telah dinyatakan sebagai spinner

 @Override
        public void onItemSelected(AdapterView<?> parent, View arg1, int position,
                long arg3) 
    {
    ItemOnChange();
       }

private void ItemOnChange() {

        if(Spinner1.getSelectedItemPosition()>0){
        pd=ProgressDialog.show(this,"","Loading, Please wait .. ",true);

            final int spinner=Spinner1.getSelectedItemPosition();


            final Handler ThreadCallback=new Handler();
            final Runnable runInCityThread=new Runnable(){
                public void run(){
                    fnBindspimmer2();
                    pd.dismiss();
                }

            };

            new Thread(){
                @Override public void run(){

                Spinner2values();
                ThreadCallback.post(runInCityThread);
                }

            }.start();
        }



}

2
2018-01-20 07:08