Пользовательский Spinner не показывает значение, возвращаемое из пользовательского диалога - PullRequest
1 голос
/ 18 августа 2011

Я создаю собственный Spinner, который показывает собственный диалог.Для этого я создал класс с именем CustomSpinner, а другой - с именем CustomSpinnerDialog.

Проблема в том, что в Spinner выбранное значение в диалоге не печатается.Я знаю, что значение возвращается правильно, я проверил его с помощью LogCat и Debug.

И в своем пользовательском диалоговом окне я создал интерфейс для onItemSelectedListener, поэтому мой класс CustomSpinner реализует этот интерфейс.Код ниже.

В XML-файле spinner я передаю его следующим образом.Он ссылается на следующий класс с именем CustomSpinner, который расширяет Spinner:

 <com.myproject.CustomSpinner
    android:id="@+id/customSpinner"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="13dp"
    android:prompt="@string/my_spinner"/>

Вот класс CustomSpinner.java :

public class CustomSpinner extends Spinner implements DialogInterface.OnClickListener, CustomSpinnerDialog.OnItemSelectedListener
{

    public OnAddListener mListener = null;
    public Context mContext;
    public String[] mDataList;
    public SpinnerAdapter mAdapter = null;


    public interface OnAddListener
    {
        void onAdd(Spinner inSpinner);
    }

    public CustomSpinner(Context context, String[] dataList) 
    {
        super(context); 
        this.mContext = context;
        this.mDataList = dataList;
    }

    public CustomSpinner(Context context, AttributeSet attrs) 
    {
        super(context, attrs);  
        this.mContext = context;
    }

    public void setDataList(String[] dataList)
    {
        this.mDataList = dataList;
    }

    @Override
    public boolean performClick() 
    {   
        boolean handled = false;
        if (!handled) 
        {
            handled = true;                                                

            mAdapter = new SpinnerAdapter(mContext, R.id.spinnerItemText, mDataList);
            CustomSpinnerDialog dialog = new CustomSpinnerDialog(mContext, mAdapter, this);               
            dialog.setOnItemSelectedListener(this);
            dialog.setDialogTitle("My custom Dialog");                 
            dialog.show();
        }        
        return handled;
    }

     @Override
     public void onClick(DialogInterface dialog, int which) 
     {
         if(which == DialogInterface.BUTTON_POSITIVE) 
         {
             if(mListener!=null)
                 mListener.onAdd(this);
         } 
         else 
         {
             setSelection(which);
         }
         dialog.dismiss();
     }

    public class SpinnerAdapter extends ArrayAdapter<String>
    {
        public Context mContext;

        public SpinnerAdapter(Context context, int textViewResourceId, String[] objects) 
        {
            super(context, textViewResourceId, objects);
            this.mContext = context;            
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {           
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View view = inflater.inflate(R.layout.spinnerdialogitem, null);
            TextView item = (TextView) view.findViewById(R.id.spinnerItemText);
            String text = mDataList[position];
            item.setText(text);
            return view;
        }
    }

    @Override
    public void onItemSelected(String itemValue) 
    {       
        int position = mAdapter.getPosition(itemValue);
        this.setSelection(3);
    }   
}

А вот CustomSpinnerDialog.java класс:

public class CustomSpinnerDialog extends Dialog implements OnItemClickListener, View.OnClickListener
{
    private OnItemSelectedListener onItemSelectedListener;

    public DialogInterface.OnClickListener mListener;
    public Context mContext;    

    public interface OnItemSelectedListener
    {
        public void onItemSelected(String itemValue);       
    }

    public CustomSpinnerDialog(Context context, CustomSpinner.SpinnerAdapter spinnerAdapter, DialogInterface.OnClickListener listener) 
    {
        super(context);     
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.setContentView(R.layout.custom_spinner);
        mListener = listener;
        mContext = context;

        ListView listView = (ListView) this.findViewById(R.id.listview);
        listView.setAdapter(spinnerAdapter);
        listView.setOnItemClickListener(this);
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);        
    }

    public void setOnItemSelectedListener(OnItemSelectedListener listener)
    {
        this.onItemSelectedListener = listener;
    }

    @Override
    public void onClick(View v) 
    {
        if(mListener != null)
            mListener.onClick(this, DialogInterface.BUTTON_POSITIVE);           
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    {
        if(mListener != null)
            mListener.onClick(this, position);
        String text = (String) parent.getItemAtPosition(position);
        onItemSelectedListener.onItemSelected(text);        
    }

    public void setDialogTitle(String title)
    {
        TextView titleText = (TextView) this.findViewById(R.id.titleText);
        titleText.setText(title);
    }   
}

Ну, Spinner запускается в действии, как это:

cSpinner= (CustomSpinner) findViewById(R.id.customSpinner);     
cSpinner.setDataList(dataList);
cSpinner.setTag("CustomSpinner");
cSpinner.setOnItemSelectedListener(controller);

Что я пробовалне решил:

В методе onItemSelected(String itemValue) в классе CustomSpinner я попытался:

this.setPrompt(itemValue); // Didnt solve

int position = mAdapter.getPosition(itemValue);//Didnt solve
this.setSelection(itemValue);

И я знаю, что это значение возвращается правильно.

Заранее спасибо.

1 Ответ

0 голосов
/ 23 августа 2011

Я просто удалил класс адаптера, объявленный в классе CustomSpinner, также удалил этот конструктор:

public CustomSpinner(Context context, String[] dataList) 
{
   super(context); 
   this.mContext = context;
   this.mDataList = dataList;
}

И вместо того, чтобы создать счетчик, подобный этому:

cSpinner= (CustomSpinner) findViewById(R.id.customSpinner);     
cSpinner.setDataList(dataList);
cSpinner.setTag("CustomSpinner");
cSpinner.setOnItemSelectedListener(controller);

Я создал его какthis:

cSpinner = (CustomSpinner)findViewById(R.id.customSpinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.options_array, R.layout.spinner_target);     
        cSpinner .setAdapter(adapter);
        cSpinner .setTag("CustomSpinner");
        cSpinner .setOnItemSelectedListener(controller);  

И spinner_target.xml, переданный в качестве последнего параметра методу createFromResource (), представляет собой простой XML-файл, имеющий только TextView:

<?xml version="1.0" encoding="utf-8"?>
<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/spinnerTarget"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:padding="8dp"/> 
...