2015-08-29 5 views
0

Я пытаюсь использовать стандартный поток основных деталей из Android Studio, но я хочу заменить элементы списка слева пользовательским представлением.Мастер Подробный поток .. выбор на поворот сломанной после переопределения getView

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

Как только я это сделаю, listSelector не запоминает выбранный элемент, когда я вращаю устройство. Я, очевидно, не внедряю что-то правильно, когда переопределяю метод getView() для адаптера, но я не могу понять, что.

+0

Я нажимаю источник на GitHub здесь: https://github.com/WarrickF/DFragTest1/ –

+0

Вот где я переопределяю getView() - https://github.com/WarrickF/DFragTest1/blob /master/app/src/main/java/app/com/victorioussolutions/dfragtest1/ContentAdapter.java –

ответ

2

Вы можете сохранить текущее положение и восстановить его из onCreateView.

private int currentCheckedPosition = 0; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    ... 
    listView.setOnItemClickListener(menuListener); 
    listView.setItemChecked(currentCheckedPosition, true); 
    ... 
} 

private AdapterView.OnItemClickListener menuListener = new AdapterView.OnItemClickListener() 
{ 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      listView.setItemChecked(currentCheckedPosition = position, true); 
      ... 
    } 
}; 


UPD
Это должно работать. Заменить код в ItemListFragment

public class ItemListFragment extends Fragment 
{ 
// private int mActivatedPosition = ListView.INVALID_POSITION; //if you want to nothing selected on activity start 
    private int mActivatedPosition = 0;//if you want to first item selected on activity start 
    private ListView listView; 

    @Override 
    public void onAttach(Activity activity) { 
     setRetainInstance(true); 
     super.onAttach(activity); 
     if (!(activity instanceof Callbacks)) { 
      throw new IllegalStateException("Activity must implement fragment's callbacks."); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     ContentAdapter mAdapter = new ContentAdapter(getActivity(), android.R.layout.simple_list_item_activated_1, android.R.id.text1, DummyContent.ITEMS); 
     View view = inflater.inflate(R.layout.fancy_activity_list, container, false); 
     listView = (ListView) view.findViewById(android.R.id.list); 
     listView.setAdapter(mAdapter); 
     listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     listView.setItemChecked(mActivatedPosition, true); 
     listView.setOnItemClickListener(itemClickListener); 
     return view; 
    } 
    private AdapterView.OnItemClickListener itemClickListener = new AdapterView.OnItemClickListener() 
    { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      listView.setItemChecked(mActivatedPosition = position, true); 
      if (getActivity() instanceof Callbacks) { 
       ((Callbacks) getActivity()).onItemSelected(DummyContent.ITEMS.get(position).id); 
      } 
     } 
    }; 

    public interface Callbacks 
    { 
     void onItemSelected(String id); 
    } 
} 

макет/fancy_activity_list_item

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="?android:attr/activatedBackgroundIndicator" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Some Content Here"/> 

</LinearLayout> 

ContentAdapter

public class ContentAdapter extends ArrayAdapter<DummyContent.DummyItem> 
{ 
    private LayoutInflater mInflater; 

    public ContentAdapter(Context context, int resource, int textViewResourceId, List<DummyContent.DummyItem> objects) { 
     super(context, resource, textViewResourceId, objects); 
     mInflater = LayoutInflater.from(getContext()); 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view; 
     if (convertView == null) { 
      view = mInflater.inflate(R.layout.fancy_activity_list_item, parent, false); 
     } else { 
      view = convertView; 
     } 
     DummyContent.DummyItem dummyItem = getItem(position); 
     TextView textView = (TextView) view.findViewById(R.id.textView); 
     textView.setText(dummyItem.content); 
     return view; 
    } 
} 

И вам нужно установить minSdkVersion 14 в build.gradle
Нужно было установить android: background = "? Android: attr/activatedBackgroundIndicator" to list Элемент макета.

+0

Конечно. Я добавил примечание к исходному вопросу со ссылкой на Git repo. –

+0

@Warrick FitzGerald. Я обновил свой ответ. – kolombo

+0

Спасибо, я пытался заставить это работать, но OnItemClickListener просто не срабатывает. Я обнаружил всевозможные сумасшедшие причины в моих поисковых процессах Google, но не все предложения, похоже, работают. они все, кажется, предлагают, что элемент щелчком мыши украл ребенок в списке, но я пока не смог понять, почему. Я нажал последние изменения ... –

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

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