3

Поскольку PreferenceFragment не поддерживается в библиотеке поддержки, я создал ListFragment, чтобы показать список настроек для пользователя, так как у меня нет большого количества настроек для показа. Я также создал обычай ArrayAdapter для настройки элементов списка. Мне нужно обработать, когда пользователь проверяет один из CheckBox s, поэтому я могу сохранить погоду или нет. Поэтому, если его проверили, он будет проверяться до тех пор, пока пользователь не отметит его. Это было бы намного проще, если бы был только один параметр в списке, но сейчас есть 2, и мне, возможно, потребуется добавить больше. Поэтому мне нужно определить, какой из них был проверен. Я могу обработать чек и снять флажок, я просто не могу найти способ определить, какой из них был проверен.Позиция Позиция От пользовательского адаптера

КОД

Вот мой список элементов:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" 
         android:orientation="horizontal"> 

<TextView android:id="@+id/pref_edit_text" android:layout_width="0dp" android:layout_height="30dp" 
       android:layout_weight="5"/> 
    <CheckBox android:id="@+id/pref_check_box" android:layout_width="0dp" android:layout_height="wrap_content" 
       android:layout_weight="1" android:onClick="onCheckBoxClick"/> 
    </LinearLayout> 

<TextView android:id="@+id/pref_edit_text2" android:layout_width="match_parent" 
       android:layout_height="50dp"/> 

Вот в моем адаптере getView():

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     //mIntCheckBoxPosition = position; 
     Typeface tf = Typeface.createFromAsset(mMainActivity.getAssets(), "fonts/ArchitectsDaughter.ttf"); 
     LayoutInflater inflater = mMainActivity.getLayoutInflater(); 
     View view = inflater.inflate(mIntLayoutId, parent, false); 

     TextView text = (TextView) view.findViewById(R.id.pref_edit_text); 
     text.setText(mStringArrayTitle[position]); 
     text.setTypeface(tf, Typeface.BOLD); 

     text = (TextView) view.findViewById(R.id.pref_edit_text2); 
     text.setText(mStringArraySubTitle[position]); 
     text.setTypeface(tf); 

     mMainActivity.setTitle("Settings"); 

     return view; 
    } 

А вот где я обращаться когда CheckBox щелкают, который находится в ListFragment:

public void onCheckBoxClick(View view) { 
     boolean isChecked = ((CheckBox) view).isChecked(); 
     Editor editor = mMainActivity.getSharedPreferences(PREF_KEY_CHECK_BOX, Activity.MODE_PRIVATE).edit(); 

     switch (view.getId()) { 
      case R.id.check_box : 
       if (isChecked) { 
        editor.putBoolean(PREF_KEY_ROUNDING, true).commit(); 
       } 
       else { 
        editor.putBoolean(PREF_KEY_ROUNDING, false).commit(); 
       } 
       break; 
      } 
     } 
    } 

Вот что мои настройки выглядят следующим образом:
enter image description here

ЧТО Я Пытался
1. Я попытался установить переменный в адаптере на позицию позиции и с помощью геттера, чтобы получить позицию, но это возвращает только позицию последнего показанного элемента.
2. Я попытался использовать некоторые из методов в ListFragment, чтобы получить позицию CheckBox, но они всегда возвращают -1.
3. Я много сделал для Googling и искал SO, но я не смог найти решение, чтобы заставить его работать.

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

+0

Любая причина, вы не можете использовать Action SherlockBar? это сэкономит вам много головной боли, так как у него довольно много шаблонов для фрагмента настроек. Плюс родной вид 4.0. –

ответ

10

Вы можете использовать setTag, чтобы добавить int к виду, указывающему его позицию, а затем снова получить его, используя getTag. Пример:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ... // your other code here 

    CheckBox checkbox = (CheckBox) view.findViewById(R.id.pref_check_box); 
    checkbox.setTag(new Integer(position)); 

} 

Тогда в вашем onCheckBoxClick:

public void onCheckBoxClick(View view) { 
    Integer pos; 
    pos = (Integer) view.getTag(); 

    ... // do what you want with `pos` here 

} 

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

  • Нет связанных вопросов^_^