Reputation: 9802
I try to create a navigation drawer with 2 seperate listview inside.
The first listview called "mDrawerList" is well displayed. - There is only one item in this list.
The second listview called "mListProcheDeChezVous" is never displayed. - There is 3 items in this listview.
When i put in comments, the first listview, the second is not displayed,so i think there is a problem when a create the second listview.. but i don't know where ?
Here is the code for the layout of navigation drawer :
<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>
And here is a piece of code of my MainActivity class :
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());
Thank you for your help,
BR
Upvotes: 7
Views: 6783
Reputation: 5034
You can define more than one ListView / any custom view add inside a ViewGroup :
Code for Main DrawerLayout XML activity:
<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>
Upvotes: 1
Reputation: 2381
the first listview has android:layout_height="match_parent" this means that it occupy the entire drawerlayout... use android:layout_height="wrap_content" in both listviews
Upvotes: 0
Reputation: 9283
Wrap the ListView in LinearLayout is a great solution. I just did this way and it works. Here is my demo 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>
and be sure to use drawer_Linearlayout when you use such as openDrawer, closeDrawer. isDrawerOpen as the param.
Upvotes: 3
Reputation: 67209
As per the Creating a Navigation Drawer guide, DrawerLayouts
should only have two children. The first is the main content view, and the second is the drawer view.
Your FrameLayout
with an id of "content_frame" is being interpreted as the view with the main content, and your ListView
with an id of "dernieres_news" is being interpreted as the drawer layout.
The third ListView
is thus ignored.
If you need both ListView
as a part of the drawer, you should wrap them in another layout such as a LinearLayout
.
Upvotes: 4