Android 主细节流。。替代getView后旋转上的选择被打断

Android 主细节流。。替代getView后旋转上的选择被打断,android,selection,master-detail,getview,Android,Selection,Master Detail,Getview,我试图使用Android Studio中的标准主细节流,但我想用自定义视图替换左侧的列表项 通过创建自己的适配器,然后重写getView()方法并返回要表示每个项的自定义布局,我可以很好地做到这一点 但是,只要我这样做,当我旋转设备时,listSelector就不记得所选的项目。当我重写适配器的getView()方法时,我显然没有正确地实现某些东西,但我似乎不知道是什么 您可以保存当前位置并从onCreateView恢复它 private int currentCheckedPositio

我试图使用Android Studio中的标准主细节流,但我想用自定义视图替换左侧的列表项

通过创建自己的适配器,然后重写getView()方法并返回要表示每个项的自定义布局,我可以很好地做到这一点


但是,只要我这样做,当我旋转设备时,listSelector就不记得所选的项目。当我重写适配器的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);
            ...
    }
};
private int currentCheckedPosition=0;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
...
setOnItemClickListener(menuListener);
setItemChecked(currentCheckedPosition,true);
...
}
private AdapterView.OnItemClickListener menuListener=new AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
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);
    }
}
公共类ItemListFragment扩展了片段
{
//private int mActivatedPosition=ListView.INVALID_POSITION;//如果要在活动开始时不选择任何内容
private int mActivatedPosition=0;//如果要在活动开始时选择第一个项目
私有列表视图列表视图;
@凌驾
公共事务主任(活动){
setRetainInstance(真);
超级转速计(活动);
if(!(回调的活动实例)){
抛出新的IllegalStateException(“活动必须实现片段的回调”);
}
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
ContentAdapter mAdapter=新的ContentAdapter(getActivity(),android.R.layout.simple\u list\u item\u activated\u 1,android.R.id.text1,DummyContent.ITEMS);
视图=充气机。充气(R.layout.fancy\u活动列表,容器,false);
listView=(listView)view.findviewbyd(android.R.id.list);
setAdapter(mAdapter);
listView.setChoiceMode(listView.CHOICE\u MODE\u SINGLE);
setItemChecked(mActivatedPosition,true);
setOnItemClickListener(itemClickListener);
返回视图;
}
私有AdapterView.OnItemClickListener项ClickListener=new AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
setItemChecked(mActivatedPosition=position,true);
if(getActivity()实例回调){
((回调)getActivity()).onItemSelected(DummyContent.ITEMS.get(position.id);
}
}
};
公共接口回调
{
已选择无效项(字符串id);
}
}
布局/花式活动列表项目

<?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;
    }
}
公共类ContentAdapter扩展了ArrayAdapter
{
私人停车场;
公共ContentAdapter(上下文上下文、int资源、int textViewResourceId、列表对象){
超级(上下文、资源、textViewResourceId、对象);
mInflater=LayoutInflater.from(getContext());
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图;
if(convertView==null){
视图=mInflater.flate(R.layout.fancy\u活动\u列表\u项,父项,false);
}否则{
视图=转换视图;
}
DummyContent.DummyItem DummyItem=getItem(位置);
TextView TextView=(TextView)view.findViewById(R.id.TextView);
setText(dummyItem.content);
返回视图;
}
}
您需要在build.gradle中设置minSdkVersion 14
它需要设置android:background=“?android:attr/activatedBackgroundIndicator”以列出项目布局

我已经在这里将源代码推送到GitHub:这是我覆盖getView()的地方-当然。我在原来的问题中添加了一个注释,其中有一个Git report的链接。谢谢,我一直在努力让这个功能正常工作,但McClick监听器就是不启动。我在谷歌搜索中找到了各种疯狂的理由,但这些建议似乎都不管用。他们似乎都在暗示这个物品被名单上的一个孩子偷走了,但我还不知道为什么。我推动了最新的更改…@Warrick FitzGerald尝试将公共类ItemListFragment Extendes ListFragment替换为公共类ItemListFragment Extendes Fragment,但我不知道为什么?此外,只要我在ContentAdapter中更改getView以返回我的自定义项目视图(fancy_activity_list_item),选择就根本不起作用。@Warrick FitzGerald您是舒尔公司的吗?您是否将ListFragment更改为Fragment?我将您的存储库分叉,将“extendslistfragment”更改为“extendslistfragment”及其工作。您需要更改它并导入android.support.v4.app.Fragment。在上次提交中,我看到注释“OnItemClickListener不工作”,但ItemListFragment扩展了ListFragment,而不是片段。