繁体   English   中英

如何使用带有自定义适配器的GridView作为首选项?

[英]How to use GridView with custom adapter as Preference item?

我有以下文件和类:

xml / preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <PreferenceCategory android:title="@string/characters_list">
        <Preference
            android:enabled="true"
            android:key="characters_view"
            android:layout="@layout/characters_view"
            android:selectable="false"/>
    </PreferenceCategory>
</PreferenceScreen>

layout / character_view.xml

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

    <com.xxx.widget.ExpandableHeightGridView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/characters_gridview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:columnWidth="380dip"
        android:numColumns="auto_fit"
        android:stretchMode="columnWidth"/>

</LinearLayout>

CharacterAdapter

class CharacterAdapter extends BaseAdapter {
    @Override
    public int getCount() {
        return characters.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        HashMap<String, String> character = characters.get(position);

        View view;

        if (convertView == null) { 
            view = inflater.inflate(R.layout.characters_view_item, null);
        } else {
            view = convertView;
        }

        // ... 

        return view;
    }
}

PreferenceActivity中,我尝试用项目填充网格视图:

protected void onCreate(Bundle bundle) {
     super.onCreate(bundle);

     setContentView(R.layout.settings);

     Preference characters = findPreference("characters_view");
     View view = characters.getView(null, null);

     ExpandableHeightGridView grid = (ExpandableHeightGridView) view.findViewById(R.id.characters_gridview);
     grid.setExpanded(true);
     grid.setAdapter(new CharacterAdapter(getCharacters()));
}

但是什么也没发生,只是看到空的偏好项:(


有人知道如何在“首选项”项中呈现GridView吗?

先感谢您!

做到了!

解决方案非常简单。 需要在getListView().getViewTreeObserver()上添加addOnGlobalLayoutListener

最后, PreferenceActivity中的 onCreate方法将如下所示:

protected void onCreate(Bundle bundle) {
     super.onCreate(bundle);

     setContentView(R.layout.settings);

     final ListView list = getListView();
     list.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // make sure it is not called anymore
            list.getViewTreeObserver().removeGlobalOnLayoutListener(this);

            View view = list.getChildAt(1);

            ExpandableHeightGridView grid = (ExpandableHeightGridView) view.findViewById(R.id.characters_gridview);
            grid.setExpanded(true);
            grid.setAdapter(new CharacterAdapter(getCharacters()));
        }
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM