динамически установить содержимое одного счетчика на основе выбранного значения другого счетчика другого класса - PullRequest
3 голосов
/ 07 мая 2011

Я создал два счетчика разных классов. Я хочу установить содержимое одного счетчика на основе выбранного значения другого счетчика, который есть в другом классе. Может ли кто-нибудь помочь мне. Спасибо заранее.

Ответы [ 2 ]

1 голос
/ 28 января 2012

Короткий ответ: вы можете сделать это программно - либо назначив новый ArrayAdapter Spinner, либо удалив / добавив элементы из существующего ArrayAdapter.

Более длинный ответ заключается в том, что вы должны бытьочень осторожно полагаясь на OnItemSelectedListener.onItemSelected (), так как он не будет вызван, если старый выбор и новый выбор окажутся в одной и той же позиции, и Spinner.getSelectedItemPosition (), поскольку он может фактически возвращать позиции, превышающие числоэлементов в ArrayAdapter, если вы удаляете элементы на лету.

У меня есть система из трех каскадных спиннеров, которые, в свою очередь, могут управлять содержимым других кнопок и текстов.Мне удалось получить 95% решений, пока я не осознал вышесказанное и не изменил свое мнение о том, что было авторитетным, а что нет - благодаря подчинению Spinner логике, которая определяет контент, а не наоборот.Поэтому вместо вызова setSelection () и использования обратного вызова onItemSelected () выполните всю каскадную логику вне обработчика и только затем вызовите setSelection () и вернитесь обратно по цепочке.

Адаптировано из моего рабочего кода:

class Spinster extends Activity {
    ...
    private void setSpinnerOne( int pos ) {
        // 1. Do our own chores, etc
        doSomeStuff();
        mSomeText.setText( "Blah!" );
        mSomeButton.setEnabled( some_condition );

        // 2. Populate dependent Spinner based on pos
        populateSpinnerTwoAdapter( pos );

        // 3. Cascade by calling SpinnerTwo logic (not the Spinner itself)
        lSpinnerTwoPos = someNiceFunction();
        setSpinnerTwo( lSpinnerTwoPos );

        // 4. Now set SpinnerOne
        mSpinnerTwo.setSelection( pos );
    }

    private void setSpinnerTwo( int pos ) {
        // Follows the same pattern as setSpinnerOne(), but cascades to SpinnerThree
    }

    private void setSpinnerThree( int pos ) {
        // Follows the same pattern as setSpinnerOne(), but need not cascade
    }

    ...

    private OnItemSelectedListener item_select = new OnItemSelectedListener() {
        public void onItemSelected( AdapterView parent, View v, int position, long id )
            {
            ...
            int lId = parent.getId();

            if ( lId == R.id.spinner_one ) {
                setSpinnerOne( position );
            } else if ( lId == R.id.spinner_two ) {
                setSpinnerTwo( position );
            } else if ( lId == R.id.spinner_three ) {
                setSpinnerThree( position );
            }
        }
    }

}

Здесь я упустил небольшую деталь, касающуюся установки и очистки защитной переменной в методах setSpinner * (), чтобы они не удосужились выполнить всю свою работу снова, когда onSelectedItemListener () перезванивает им.Я думаю, что базовую логику легче показать, если ее опустить.(И они не строго должны быть там - onItemSelected () не будет вызываться во второй раз.)

Я мог бы опубликовать реальный, рабочий пример, если это считаетсяаннотация.

1 голос
/ 25 ноября 2011

Есть решение, вы можете подумать, что его реализация будет длительной, но, думаю, оно будет работать идеально!

Допустим, у вас есть spinner_one в вашем ActivityOne.class и spinner_two в вашем ActivityTwo.class. И вы хотите заполнить spinner_2 на основе того, что выбрано в spinner_1.

Тогда

spinner_1.setOnItemSelectedListener(new OnItemSelectedListener() {

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

                 // save your selected item into a SharedPreference Variable
        }    
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {

        }
});

Теперь для spinner_2:

String spinner1_value=get value from SharedPreference;
if(spinner1_value.equals("something_1"))
{
   //populate spinner_2 accordingly
}
else if(spinner1_value.equals("something_2"))
{
   //populate spinner_2 accordingly
}
else
{
   //populate spinner_2 accordingly
}

И не забудьте поместить этот код для заполнения spinner_2 в onResume () вашего ActivityTwo.class, чтобы он отражал изменения, сделанные пользователем в значении spinner_1.

Это позволит вам изменять содержимое spinner_2 в соответствии со значением spinner_1 по мере изменения пользователем.

...