Master Detail Flow .. 覆盖 getView 后旋转中断的选择

Master Detail Flow .. selection on rotate broken after override of getView

我正在尝试使用来自 Android Studio 的标准 Master Detail Flow,但我想用自定义视图替换左侧的列表项。

我可以通过创建自己的适配器然后覆盖 getView() 方法并返回我想要表示每个项目的自定义布局来很好地完成此操作。

虽然我这样做了,但是当我旋转设备时,listSelector 不记得所选的项目。当我重写 Adapter 的 getView() 方法时,我显然没有正确实现某些东西,但我似乎无法弄清楚是什么。

您可以保存当前位置并从 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);
    }
}

layout/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>

内容适配器

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;
    }
}

并且需要在build.gradle
中设置minSdkVersion 14 它需要设置 android:background="?android:attr/activatedBackgroundIndicator" 来列出 Item 布局。