2016-03-28 14 views
1

Help me! NavigationViewはリストビューを作成できません。私はNavigationViewスライドの右にリストメニューを作成したい。Android Studio NavigationViewでリストビューを作成できません

コード、実行することができないエラーなしエラー

:java.lang.RuntimeException:活性 ComponentInfo {jp.vertice.myapplication/jp.vertice.myapplication.MainActivity}を開始できません: ジャワ.lang.NullPointerException: ヌルオブジェクト参照に仮想メソッドを呼び出すための試み 'ボイド android.widget.ListView.setAdapter(android.widget.ListAdapter)'

MainActivity.java

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 
     ListView listView; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     listView = (ListView) findViewById(R.id.listView); 

     String[] values = new String[] { "List 1", 
       "List 2", 
       "List 3", 
       "List 4", 
       "List 5" 
     }; 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, android.R.id.text1, values); 

     listView.setAdapter(adapter); 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) { 

       int itemPosition  = position; 

       String itemValue = (String) listView.getItemAtPosition(position); 

       Toast.makeText(getApplicationContext(), 
         "Position :" + itemPosition + " ListItem : " + itemValue, Toast.LENGTH_LONG) 
         .show(); 
      } 
     }); 
    } 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:openDrawer="start"> 

    <include 
     layout="@layout/app_bar_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view_right" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="end" 
     android:fitsSystemWindows="true" 
     app:headerLayout="@layout/nav_menu_right" /> 

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

nav_menu_right.xml

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

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/listView" /> 
</LinearLayout> 

答えて

0

私はあなたのコードを更新しました。あなたのコードに置き換えてください。 NullPointerExceptionの理由は、listViewを直接検索しようとしていたのですが、listViewはNavigationViewのヘッダーなので、まずNavigationViewのビューを見つけてNavigationViewからヘッダーを取得し、そのヘッダーを使用して必要なlistViewを見つける必要があります。

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 
     ListView listView; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     NavigationView navigationViewRight = (NavigationView) findViewById(R.id.nav_view_right); 
     View header = navigationViewRight.getHeaderView(0); 
     listView = (ListView) header.findViewById(R.id.listView); 

     String[] values = new String[] { "List 1", 
       "List 2", 
       "List 3", 
       "List 4", 
       "List 5" 
     }; 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, android.R.id.text1, values); 

     listView.setAdapter(adapter); 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) { 

       int itemPosition  = position; 

       String itemValue = (String) listView.getItemAtPosition(position); 

       Toast.makeText(getApplicationContext(), 
         "Position :" + itemPosition + " ListItem : " + itemValue, Toast.LENGTH_LONG) 
         .show(); 
      } 
     }); 
    } 
-1

カスタムリストビューを使用して作成することができます。 activity_navigation_view.xml

<?xml version="1.0" encoding="utf-8"?> 
    <android.support.v4.widget.DrawerLayout 
     android:id="@+id/drawer_layout" 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fitsSystemWindows="true"> 

     <include layout="@layout/navigation_view_fragment_container"/> 

     <android.support.design.widget.NavigationView 
      android:id="@+id/nav_view" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" 
      android:fitsSystemWindows="true" 
      app:headerLayout="@layout/navigation_view_header"> 

      <ExpandableListView 
       android:id="@+id/navigationmenu" 
       android:layout_width="wrap_content" 
       android:layout_height="match_parent" 
       android:layout_marginTop="192dp" 
       android:background="@android:color/white"> 
      </ExpandableListView> 
     </android.support.design.widget.NavigationView> 
    </android.support.v4.widget.DrawerLayout> 

次のように拡張可能なリストビュー用のアダプタがある下のコードを参照してください。次のように

ExpandableListAdapter.java

public class ExpandableListAdapter extends BaseExpandableListAdapter { 
    private Context mContext; 
    private List<ExpandedMenuModel> mListDataHeader; // header titles 

    // child data in format of header title, child title 
    private HashMap<ExpandedMenuModel, List<String>> mListDataChild; 
    ExpandableListView expandList; 

    public ExpandableListAdapter(Context context, List<ExpandedMenuModel> listDataHeader, HashMap<ExpandedMenuModel, List<String>> listChildData, ExpandableListView mView) { 
     this.mContext = context; 
     this.mListDataHeader = listDataHeader; 
     this.mListDataChild = listChildData; 
     this.expandList = mView; 
    } 

    @Override 
    public int getGroupCount() { 
     int i = mListDataHeader.size(); 
     Log.d("GROUPCOUNT", String.valueOf(i)); 
     return this.mListDataHeader.size(); 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     int childCount = 0; 
     if (groupPosition != 2) { 
      childCount = this.mListDataChild.get(this.mListDataHeader.get(groupPosition)) 
       .size(); 
     } 
     return childCount; 
    } 

    @Override 
    public Object getGroup(int groupPosition) { 
     return this.mListDataHeader.get(groupPosition); 
    } 

    @Override 
    public Object getChild(int groupPosition, int childPosition) { 
     Log.d("CHILD", mListDataChild.get(this.mListDataHeader.get(groupPosition)) 
      .get(childPosition).toString()); 
     return this.mListDataChild.get(this.mListDataHeader.get(groupPosition)) 
      .get(childPosition); 
    } 

    @Override 
    public long getGroupId(int groupPosition) { 
     return groupPosition; 
    } 

    @Override 
    public long getChildId(int groupPosition, int childPosition) { 
     return childPosition; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return false; 
    } 

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 
     ExpandedMenuModel headerTitle = (ExpandedMenuModel) getGroup(groupPosition); 
     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this.mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.listheader, null); 
     } 
     TextView lblListHeader = (TextView) convertView 
      .findViewById(R.id.submenu); 
     ImageView headerIcon = (ImageView) convertView.findViewById(R.id.iconimage); 
     lblListHeader.setTypeface(null, Typeface.BOLD); 
     lblListHeader.setText(headerTitle.getIconName()); 
     headerIcon.setImageResource(headerTitle.getIconImg()); 
     return convertView; 
    } 

    @Override 
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
     final String childText = (String) getChild(groupPosition, childPosition); 

     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) this.mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.list_submenu, null); 
     } 

     TextView txtListChild = (TextView) convertView 
      .findViewById(R.id.submenu); 

     txtListChild.setText(childText); 

     return convertView; 
    } 

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     return true; 
    } 
} 

list_submenu.xmlです。

<?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:orientation="vertical"> 

    <TextView 
     android:id="@+id/submenu" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="20dp" 
     android:padding="10dp" 
     android:textColor="#000000" 
     android:textSize="18sp"/> 
</LinearLayout> 

listheader.xmlは以下のとおりです。

<?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="2dp" 
       android:orientation="vertical"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginLeft="20dp" 
     android:orientation="horizontal"> 

     <ImageView 
      android:id="@+id/iconimage" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:paddingBottom="10dp" 
      android:paddingLeft="10dp" 
      android:paddingTop="10dp"/> 

     <TextView 
      android:id="@+id/submenu" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:padding="10dp" 
      android:textColor="#000000" 
      android:textSize="20sp"/> 

    </LinearLayout> 

</LinearLayout> 

ナビゲーションビューのアクティビティで、展開可能なリストビューのアダプタを設定します。 NavigationViewActivity.java

public class NavigationViewActivity extends AppCompatActivity { 

    private DrawerLayout mDrawerLayout; 
    ExpandableListAdapter mMenuAdapter; 
    ExpandableListView expandableList; 
    List<ExpandedMenuModel> listDataHeader; 
    HashMap<ExpandedMenuModel, List<String>> listDataChild; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_navigation_view); 
     final ActionBar ab = getSupportActionBar(); 
     /* to set the menu icon image*/ 
     ab.setHomeAsUpIndicator(R.drawable.ic_menu); 
     ab.setDisplayHomeAsUpEnabled(true); 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     expandableList = (ExpandableListView) findViewById(R.id.navigationmenu); 
     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 

     if (navigationView != null) { 
      setupDrawerContent(navigationView); 
     } 

     prepareListData(); 
     mMenuAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild, expandableList); 

     // setting list adapter 
     expandableList.setAdapter(mMenuAdapter); 
    } 

    private void prepareListData() { 
     listDataHeader = new ArrayList<ExpandedMenuModel>(); 
     listDataChild = new HashMap<ExpandedMenuModel, List<String>>(); 

     ExpandedMenuModel item1 = new ExpandedMenuModel(); 
     item1.setIconName("heading1"); 
     item1.setIconImg(R.drawable.ic_menu_grid_view1); 
     // Adding data header 
     listDataHeader.add(item1); 

     ExpandedMenuModel item2 = new ExpandedMenuModel(); 
     item2.setIconName("heading2"); 
     item2.setIconImg(R.drawable.ic_menu_list_view); 
     listDataHeader.add(item2); 

     ExpandedMenuModel item3 = new ExpandedMenuModel(); 
     item3.setIconName("heading3"); 
     item3.setIconImg(R.drawable.ic_attachment_album); 
     listDataHeader.add(item3); 

     // Adding child data 
     List<String> heading1 = new ArrayList<String>(); 
     heading1.add("Submenu of item 1"); 

     List<String> heading2 = new ArrayList<String>(); 
     heading2.add("Submenu of item 2"); 
     heading2.add("Submenu of item 2"); 
     heading2.add("Submenu of item 2"); 

     listDataChild.put(listDataHeader.get(0), heading1);// Header, Child data 
     listDataChild.put(listDataHeader.get(1), heading2); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case android.R.id.home: 
       mDrawerLayout.openDrawer(GravityCompat.START); 
       return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void setupDrawerContent(NavigationView navigationView) { 
     navigationView.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(MenuItem menuItem) { 
        menuItem.setChecked(true); 
        mDrawerLayout.closeDrawers(); 
        return true; 
       } 
      }); 
    } 

    } 
    ExpandedMenuModel class contains menu item details as follow. 

    ExpandedMenuModel.java 

    public class ExpandedMenuModel { 

    String iconName = ""; 
    int iconImg = -1; // menu icon resource id 

    public String getIconName() { 
     return iconName; 
    } 
    public void setIconName(String iconName) { 
     this.iconName = iconName; 
    } 
    public int getIconImg() { 
     return iconImg; 
    } 
    public void setIconImg(int iconImg) { 
     this.iconImg = iconImg; 
    } 
    }