【问题标题】:Master Detail Flow .. selection on rotate broken after override of getViewMaster Detail Flow .. 覆盖 getView 后旋转时的选择被破坏
【发布时间】:2015-08-29 17:36:52
【问题描述】:

我正在尝试使用 Android Studio 中的标准主详细信息流,但我想用自定义视图替换左侧的列表项。

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

不过,只要我这样做,当我旋转设备时,listSelector 就不会记住选定的项目。当我覆盖适配器的 getView() 方法时,我显然没有正确实现某些东西,但我似乎无法弄清楚是什么。

【问题讨论】:

标签: android selection master-detail getview


【解决方案1】:

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

内容适配器

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 布局。

【讨论】:

  • 当然。我在原始问题中添加了一条注释,其中包含指向 Git 存储库的链接
  • 谢谢,我一直在努力让它工作,但 OnItemClickListener 不会触发。我在 Google 搜索中找到了各种疯狂的理由,但似乎没有一个建议有效。他们似乎都暗示该项目是点击被列表中的一个孩子偷走了,但我还没有弄清楚为什么。我推送了最新的变化...
  • @Warrick FitzGerald 尝试替换 public class ItemListFragment extends ListFragment to public class ItemListFragment extends Fragment
  • 这似乎确实有效,虽然我不知道为什么?此外,只要我在 ContentAdapter 中更改 getView 以返回我的自定义项目视图 (fancy_activity_list_item),选择就根本不起作用。
  • @Warrick FitzGerald 你确定你把 ListFragment 改成 Fragment 吗?我分叉了您的存储库,将“扩展 ListFragment”更改为“扩展片段”及其工作。您需要更改它并导入 android.support.v4.app.Fragment。在您的最后一次提交中,我看到评论“OnItemClickListener not working”,但 ItemListFragment 扩展了 ListFragment,而不是 Fragment。
猜你喜欢
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2020-11-04
  • 2021-04-06
  • 2011-08-21
  • 1970-01-01
相关资源
最近更新 更多