【问题标题】:Add 2 listview's in navigation drawer, only one works在导航抽屉中添加 2 个列表视图,只有一个有效
【发布时间】:2014-10-16 22:27:09
【问题描述】:

我尝试创建一个导航抽屉,里面有 2 个单独的列表视图。

第一个名为 "mDrawerList" 的列表视图显示良好。 - 此列表中只有一项。

名为 “mListProcheDeChezVous”的第二个列表视图 永远不会显示。 - 此列表视图中有 3 个项目。

当我放入cmets时,第一个listview,第二个不显示,所以我认为创建第二个listview时有问题..但我不知道在哪里?

这是导航抽屉布局的代码:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ListView
        android:id="@+id/dernieres_news"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="#E3E9E3"
        android:dividerHeight="1dp"
        android:background="#F3F3F4"/>

    <ListView
        android:id="@+id/pres_de_chez_vous"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="#E3E9E3"
        android:dividerHeight="1dp"
        android:background="#F3F3F4"/>

</android.support.v4.widget.DrawerLayout>

这是我的 MainActivity 类的一段代码:

public class MainActivity extends Activity {
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList, mListProcheDeChezVous;
    private ActionBarDrawerToggle mDrawerToggle;

    private CharSequence mDrawerTitle;
    private CharSequence mTitle;
    private String[] mPlanetTitles;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTitle = mDrawerTitle = getTitle();
        mPlanetTitles = getResources().getStringArray(R.array.planets_array);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        // Declaration of the 2 listview's 
        mDrawerList = (ListView) findViewById(R.id.dernieres_news);
        mListProcheDeChezVous= (ListView) findViewById(R.id.pres_de_chez_vous);

        LayoutInflater inflater = getLayoutInflater();

        // Add header news title
        ViewGroup header_news = (ViewGroup)inflater.inflate(R.layout.header_dernieres_news, mDrawerList, false);
        mDrawerList.addHeaderView(header_news, null, false);

        // Add header "proche de chez vous title"
        ViewGroup header_pres_de_chez_vous = (ViewGroup)inflater.inflate(R.layout.header_pres_de_chez_vous, mListProcheDeChezVous, false);
        mListProcheDeChezVous.addHeaderView(header_pres_de_chez_vous, null, false);

        // set a custom shadow that overlays the main content when the drawer opens
        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

        /*
         * FIRST ADAPTER FOR FIRST LISTVIEW
         */

        String[] names=new String[]{"Dernières News"};

        /*Array of Images*/
        int[] image = new int[] {R.drawable.ic_action_feed};

        List<HashMap<String, String>> listinfo = new ArrayList<HashMap<String, String>>();
        listinfo.clear();
        for(int i=0;i<1;i++){
            HashMap<String, String> hm = new HashMap<String, String>();
            hm.put("name", names[i]);
            hm.put("image", Integer.toString(image[i]));
            listinfo.add(hm);
        }

        // Keys used in Hashmap
        String[] from = { "image", "name" };
        int[] to = { R.id.img, R.id.txt };
        SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), listinfo, R.layout.drawer_list_item, from, to);
        mDrawerList.setAdapter(adapter);

        /*
         * SECOND ADAPTER FOR SECOND LISTVIEW
         */

        String[] names_pres_de_chez_vous = new String[]{"Finistère", "Morbihan", "Côtes d'Armor"};

        /*Array of Images*/
        int[] image_pres_de_chez_vous = new int[] {R.drawable.ic_action_gear, R.drawable.ic_action_gear, R.drawable.ic_action_gear};

        List<HashMap<String, String>> listinfo_pres_de_chez_vous = new ArrayList<HashMap<String, String>>();
        listinfo_pres_de_chez_vous.clear();
        for(int i=0;i<3;i++){
            HashMap<String, String> hm_pres_de_chez_vous = new HashMap<String, String>();
            hm_pres_de_chez_vous.put("name", names_pres_de_chez_vous[i]);
            hm_pres_de_chez_vous.put("image", Integer.toString(image_pres_de_chez_vous[i]));
            listinfo_pres_de_chez_vous.add(hm_pres_de_chez_vous);
        }

        // Keys used in Hashmap
        String[] from_pres_de_chez_vous = { "image", "name" };
        int[] to_pres_de_chez_vous = { R.id.img, R.id.txt };
        SimpleAdapter adapter_pres_de_chez_vous = new SimpleAdapter(getBaseContext(), listinfo_pres_de_chez_vous, R.layout.drawer_list_item_pres_de_chez_vous, from_pres_de_chez_vous, to_pres_de_chez_vous);
        mListProcheDeChezVous.setAdapter(adapter_pres_de_chez_vous);

        mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
        mListProcheDeChezVous.setOnItemClickListener(new DrawerItemClickListener());

感谢您的帮助,

BR

【问题讨论】:

  • DrawerLayout 只支持两个子视图。为什么还需要两个 ListView?

标签: android android-listview navigation-drawer


【解决方案1】:

根据创建Navigation Drawer guideDrawerLayouts 应该只有两个孩子。第一个是主要内容视图,第二个是抽屉视图。

id 为“content_frame”的FrameLayout 被解释为包含主要内容的视图,而id 为“dernieres_news”的ListView 被解释为抽屉布局。

因此忽略第三个ListView

如果您需要两个ListView 作为抽屉的一部分,您应该将它们包装在另一个布局中,例如LinearLayout

【讨论】:

  • 谢谢,你的解释很清楚。我尝试将 2 个列表视图分组为线性布局,但在启动应用程序时出现此错误:Unable to start activity ComponentInfo{com.example.android.navigationdrawerexample/com.example.android.navigationdrawerexample.MainActivity}: java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.support.v4.widget.DrawerLayout$LayoutParams
  • 嘿 wawanopoulos,我也遇到了和你一样的问题。也许这是 google 的限制,谁能给出一些解决方案?
  • 以防万一有人偶然发现ClassCastException,例如@wawanopoulos 和我。至少在我的情况下,原因是活动的周围代码仍然使用以前的单个 ListView 进行 openDrawer()、closeDrawer() 等
【解决方案2】:

在 LinearLayout 中包装 ListView 是一个很好的解决方案。我就是这样做的,它有效。 这是我的演示 xml:

<LinearLayout
        android:id="@+id/drawer_Linearlayout"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:orientation="vertical" >

        <Button
            android:id="@+id/btn_clear"
            android:layout_width="240dp"
            android:layout_height="wrap_content" 
            android:text="ABC"/>

        <ListView
            android:id="@+id/left_drawer"
            android:layout_width="240dp"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:background="#111"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp" />
    </LinearLayout>

在使用openDrawer、closeDrawer等时一定要使用drawer_Linearlayout。 isDrawerOpen 作为参数。

【讨论】:

    【解决方案3】:

    您可以在 ViewGroup 中定义多个 ListView / 添加任何自定义视图:

    Main DrawerLayout XML 活动的代码:

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/drawerlayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
    
    <!-- This is the fragment Layout -->
    
            <FrameLayout
                android:id="@+id/fragmnetlayout"
                android:layout_width="match_parent"
                android:layout_height="match_parent" >
            </FrameLayout>
    
     <!-- this LinearLayout as a Drawerlayout inside it create two ListView With Its Items Title -->
    
            <LinearLayout
                android:id="@+id/lldrawercontent"
                android:layout_width="240dp"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                android:orientation="vertical" >
    
                <TextView
                    android:id="@+id/tvsocialsites"
                    android:layout_width="match_parent"
                    android:layout_height="30dp"
                    android:background="#12ccad"
                    android:gravity="center"
                    android:text="@string/socialsites"
                    android:textSize="15sp" />
    
                <ListView
                    android:id="@+id/drawerlistleft"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:background="#ffccee"
                    android:choiceMode="singleChoice"
                    android:divider="@null" />
    
                <TextView
                    android:id="@+id/tvweakdays"
                    android:layout_width="match_parent"
                    android:layout_height="30dp"
                    android:background="#12ccad"
                    android:gravity="center"
                    android:text="@string/weaksdy"
                    android:textSize="15sp" />
    
                <ListView
                    android:id="@+id/drawerlistweakdy"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:background="#32fbdc"
                    android:choiceMode="singleChoice" >
                </ListView>
            </LinearLayout>
    
        </android.support.v4.widget.DrawerLayout>
    

    【讨论】:

      【解决方案4】:

      第一个列表视图有 android:layout_height="match_parent" 这意味着它占据了整个抽屉布局...... 利用 android:layout_height="wrap_content" 在两个列表视图中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        相关资源
        最近更新 更多