2014-11-15 2 views
0

방금이 튜토리얼 http://www.tutecentral.com/android-custom-navigation-drawer/을 따라 갔고 탐색 용 서랍을 사용하는 애플리케이션을 만들었습니다. 이 링크를 살펴보면 앱을 만드는 부분과 맞춤 설정하는 부분 (회 전자와 머리글을 추가하는 부분)이 2 부분으로 구성되어 있음을 알 수 있습니다. 머리글 만 추가하고 싶지만 방법을 파악할 수는 없습니다. 나는 또한 약간 대답을위한 Google를 검사하고 그러나 아직 1 개를 찾아 내지 않았다, 여기조차 ... 누군가 저를 계몽 할 수 있는가?탐색 드로어에 헤더 추가

public class MainActivity extends Activity { 

    private DrawerLayout mDrawerLayout; 
    private ListView mDrawerList; 
    private ActionBarDrawerToggle mDrawerToggle; 

    private CharSequence mDrawerTitle; 
    private CharSequence mTitle; 
    CustomDrawerAdapter adapter; 

    List<DrawerItem> dataList; 

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

     // Initializing 
     dataList = new ArrayList<DrawerItem>(); 
     mTitle = mDrawerTitle = getTitle(); 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawerList = (ListView) findViewById(R.id.left_drawer); 

     mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, 
       GravityCompat.START); 

     // Add Drawer Item to dataList 



     dataList.add(new DrawerItem("Message", R.drawable.ic_action_email)); 
     dataList.add(new DrawerItem("Likes", R.drawable.ic_action_good)); 
     dataList.add(new DrawerItem("Games", R.drawable.ic_action_gamepad)); 
     dataList.add(new DrawerItem("Lables", R.drawable.ic_action_labels)); 


     dataList.add(new DrawerItem("Search", R.drawable.ic_action_search)); 
     dataList.add(new DrawerItem("Cloud", R.drawable.ic_action_cloud)); 
     dataList.add(new DrawerItem("Camara", R.drawable.ic_action_camera)); 
     dataList.add(new DrawerItem("Video", R.drawable.ic_action_video)); 
     dataList.add(new DrawerItem("Groups", R.drawable.ic_action_group)); 
     dataList.add(new DrawerItem("Import & Export", 
       R.drawable.ic_action_import_export)); 


     dataList.add(new DrawerItem("About", R.drawable.ic_action_about)); 
     dataList.add(new DrawerItem("Settings", R.drawable.ic_action_settings)); 
     dataList.add(new DrawerItem("Help", R.drawable.ic_action_help)); 

     adapter = new CustomDrawerAdapter(this, R.layout.custom_drawer_item, 
       dataList); 

     mDrawerList.setAdapter(adapter); 

     mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

     getActionBar().setDisplayHomeAsUpEnabled(true); 
     getActionBar().setHomeButtonEnabled(true); 

     mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
       R.drawable.ic_drawer, R.string.drawer_open, 
       R.string.drawer_close) { 
      public void onDrawerClosed(View view) { 
       getActionBar().setTitle(mTitle); 
       invalidateOptionsMenu(); // creates call to 
       // onPrepareOptionsMenu() 
      } 

      public void onDrawerOpened(View drawerView) { 
       getActionBar().setTitle(mDrawerTitle); 
       invalidateOptionsMenu(); // creates call to 
       // onPrepareOptionsMenu() 
      } 
     }; 

     mDrawerLayout.setDrawerListener(mDrawerToggle); 

     if (savedInstanceState == null) { 
      SelectItem(0); 
     } 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    public void SelectItem(int possition) { 

     Fragment fragment = null; 
     Bundle args = new Bundle(); 
     switch (possition) { 
      case 0: 
       fragment = new FragmentOne(); 
       args.putString(FragmentOne.ITEM_NAME, dataList.get(possition) 
         .getItemName()); 
       args.putInt(FragmentOne.IMAGE_RESOURCE_ID, dataList.get(possition) 
         .getImgResID()); 
       break; 
      case 1: 
       fragment = new FragmentTwo(); 
       args.putString(FragmentTwo.ITEM_NAME, dataList.get(possition) 
         .getItemName()); 
       args.putInt(FragmentTwo.IMAGE_RESOURCE_ID, dataList.get(possition) 
         .getImgResID()); 
       break; 
      case 2: 
       fragment = new FragmentThree(); 
       args.putString(FragmentThree.ITEM_NAME, dataList.get(possition) 
         .getItemName()); 
       args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition) 
         .getImgResID()); 
       break; 
      case 3: 
       fragment = new FragmentOne(); 
       args.putString(FragmentOne.ITEM_NAME, dataList.get(possition) 
         .getItemName()); 
       args.putInt(FragmentOne.IMAGE_RESOURCE_ID, dataList.get(possition) 
         .getImgResID()); 
       break; 
      case 4: 
       fragment = new FragmentTwo(); 
       args.putString(FragmentTwo.ITEM_NAME, dataList.get(possition) 
         .getItemName()); 
       args.putInt(FragmentTwo.IMAGE_RESOURCE_ID, dataList.get(possition) 
         .getImgResID()); 
       break; 
      case 5: 
       fragment = new FragmentThree(); 
       args.putString(FragmentThree.ITEM_NAME, dataList.get(possition) 
         .getItemName()); 
       args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition) 
         .getImgResID()); 
       break; 
      case 6: 
       fragment = new FragmentOne(); 
       args.putString(FragmentOne.ITEM_NAME, dataList.get(possition) 
         .getItemName()); 
       args.putInt(FragmentOne.IMAGE_RESOURCE_ID, dataList.get(possition) 
         .getImgResID()); 
       break; 
      case 7: 
       fragment = new FragmentTwo(); 
       args.putString(FragmentTwo.ITEM_NAME, dataList.get(possition) 
         .getItemName()); 
       args.putInt(FragmentTwo.IMAGE_RESOURCE_ID, dataList.get(possition) 
         .getImgResID()); 
       break; 
      case 8: 
       fragment = new FragmentThree(); 
       args.putString(FragmentThree.ITEM_NAME, dataList.get(possition) 
         .getItemName()); 
       args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition) 
         .getImgResID()); 
       break; 
      case 9: 
       fragment = new FragmentOne(); 
       args.putString(FragmentOne.ITEM_NAME, dataList.get(possition) 
         .getItemName()); 
       args.putInt(FragmentOne.IMAGE_RESOURCE_ID, dataList.get(possition) 
         .getImgResID()); 
       break; 
      case 10: 
       fragment = new FragmentTwo(); 
       args.putString(FragmentTwo.ITEM_NAME, dataList.get(possition) 
         .getItemName()); 
       args.putInt(FragmentTwo.IMAGE_RESOURCE_ID, dataList.get(possition) 
         .getImgResID()); 
       break; 
      case 11: 
       fragment = new FragmentThree(); 
       args.putString(FragmentThree.ITEM_NAME, dataList.get(possition) 
         .getItemName()); 
       args.putInt(FragmentThree.IMAGE_RESOURCE_ID, dataList.get(possition) 
         .getImgResID()); 
       break; 
      case 12: 
       fragment = new FragmentOne(); 
       args.putString(FragmentOne.ITEM_NAME, dataList.get(possition) 
         .getItemName()); 
       args.putInt(FragmentOne.IMAGE_RESOURCE_ID, dataList.get(possition) 
         .getImgResID()); 
       break; 
      default: 
       break; 
     } 

     fragment.setArguments(args); 
     FragmentManager frgManager = getFragmentManager(); 
     frgManager.beginTransaction().replace(R.id.content_frame, fragment) 
       .commit(); 

     mDrawerList.setItemChecked(possition, true); 
     setTitle(dataList.get(possition).getItemName()); 
     mDrawerLayout.closeDrawer(mDrawerList); 

    } 

    @Override 
    public void setTitle(CharSequence title) { 
     mTitle = title; 
     getActionBar().setTitle(mTitle); 
    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     // Sync the toggle state after onRestoreInstanceState has occurred. 
     mDrawerToggle.syncState(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     // Pass any configuration change to the drawer toggles 
     mDrawerToggle.onConfigurationChanged(newConfig); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // The action bar home/up action should open or close the drawer. 
     // ActionBarDrawerToggle will take care of this. 
     if (mDrawerToggle.onOptionsItemSelected(item)) { 
      return true; 
     } 

     return false; 
    } 

    private class DrawerItemClickListener implements 
      ListView.OnItemClickListener { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, 
           long id) { 
      SelectItem(position); 

     } 
    } 

} 

CustomDrawerAdapter.java :

public class CustomDrawerAdapter extends ArrayAdapter<DrawerItem> { 

    Context context; 
    List<DrawerItem> drawerItemList; 
    int layoutResID; 

    public CustomDrawerAdapter(Context context, int layoutResourceID, 
           List<DrawerItem> listItems) { 
     super(context, layoutResourceID, listItems); 
     this.context = context; 
     this.drawerItemList = listItems; 
     this.layoutResID = layoutResourceID; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     DrawerItemHolder drawerHolder; 
     View view = convertView; 

     if (view == null) { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      drawerHolder = new DrawerItemHolder(); 

      view = inflater.inflate(layoutResID, parent, false); 
      drawerHolder.ItemName = (TextView) view 
        .findViewById(R.id.drawer_itemName); 
      drawerHolder.icon = (ImageView) view.findViewById(R.id.drawer_icon); 

      view.setTag(drawerHolder); 

     } else { 
      drawerHolder = (DrawerItemHolder) view.getTag(); 

     } 

     DrawerItem dItem = (DrawerItem) this.drawerItemList.get(position); 

     drawerHolder.icon.setImageDrawable(view.getResources().getDrawable(
       dItem.getImgResID())); 
     drawerHolder.ItemName.setText(dItem.getItemName()); 

     return view; 
    } 

    private static class DrawerItemHolder { 
     TextView ItemName; 
     ImageView icon; 
    } 
} 

DrawerItem.java :

public class DrawerItem { 

    String ItemName; 
    int imgResID; 

    public DrawerItem(String itemName, int imgResID) { 
     super(); 
     ItemName = itemName; 
     this.imgResID = imgResID; 
    } 

    public String getItemName() { 
     return ItemName; 

    } 
     public void setItemName(String itemName) { 
     ItemName = itemName; 
    } 
    public int getImgResID() { 
     return imgResID; 
    } 
    public void setImgResID(int imgResID) { 
     this.imgResID = imgResID; 
    } 

} 
+0

즉, ListView에 다른 레이아웃을 가진 일부 항목을 포함 시키시겠습니까? – Simas

+0

http://2.bp.blogspot.com/-UC1gAayQdak/Ug_I8QdbP_I/AAAAAAAAAsI/fzmtJ-kAhXo/s1600/sectionlist.png 이것이 내가 원하는 것입니다. ** 내 친구들 ** 및 ** AndroidVersion **? – Alec

+0

알겠습니다. 어댑터 코드를 게시하십시오. – Simas

답변

1

싶은 것은 다른 2를 만들 수

는 MainActivity.java입니다 일반 항목 및 헤더 항목에 대한 레이아웃 파일. 예를 들면 :

list_header.xml :

<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/textView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textSize="20sp"/> 

list_item.xml

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    <ImageView 
     android:id="@+id/imageView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toLeftOf="@id/imageView" 
     android:textSize="20sp"/> 
</RelativeLayout> 

그 다음은 2 개의 다른 종류와 용도를 인식 귀하의 어댑터가 몇 메소드를 오버라이드 (override) 할 필요가 있도록 다른 경우 convertViews :

@Override 
public int getViewTypeCount() { 
    return 2; 
} 

@Override 
public int getItemViewType(int position) { 
    if (getItem(position).getImgResID() == 0) { 
     // Header type = 1 
     return 1; 
    } else { 
     // Normal item types = 0 
     return 0; 
    } 
} 

마침내 모든 마법은 getView 방법 내부에서 발생합니다. 그런 다음 항목과 같을 것이다

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    DrawerItemHolder drawerHolder; 

    DrawerItem dItem = getItem(position); 

    if (convertView == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     drawerHolder = new DrawerItemHolder(); 
     if (dItem.getImgResID() == 0) { 
      // Inflate header layout 
      convertView = inflater.inflate(R.layout.list_header, parent, false); 
      drawerHolder.ItemName = (TextView) convertView.findViewById(R.id.textView); 
      // ... 
     } else { 
      // Inflate normal layout 
      convertView = inflater.inflate(R.layout.list_item, parent, false); 
      drawerHolder.ItemName = (TextView) convertView.findViewById(R.id.textView); 
      drawerHolder.icon = (ImageView) convertView.findViewById(R.id.imageView); 
     } 
     convertView.setTag(drawerHolder); 
    } else { 
     drawerHolder = (DrawerItemHolder) convertView.getTag(); 
    } 

    drawerHolder.ItemName = dItem.getItemName(); 

    // ... 

    return convertView; 
} 

: 그것은 특정 레이아웃을 특정 위치에있는 항목은 헤더 있는지 확인하고, 팽창하자

DrawerItem("Header1", 0, true); 
DrawerItem("Message", R.drawable.ic_action_email); 
DrawerItem("Message", R.drawable.ic_action_email); 
DrawerItem("Header2", 0, true); 
DrawerItem("Message", R.drawable.ic_action_email); 

참고 : 헤더는 당김없이 간단한 아이템입니다 (img res id == 0).

+0

마지막 줄 ** drawerHolder = (DrawerItemHolder) convertView.getTag(); ** 경고 메시지 ** 호환되지 않는 유형 ** – Alec

+0

@ MasterZYuri 프로젝트에 맞게 구현해야합니다. 이 코드는 대부분 스 니펫입니다. – Simas

+0

좋아, 지금은 추락 할 뿐이야. 지금 자러 가야 해. 내일 다시 시도해보고 작동하는지 알려 줄거야. – Alec