У меня есть одно приложение, в котором я использовал это руководство: http://developer.android.com/training/implementing-navigation/nav-drawer.html
Сейчас я работаю над новым проектом, в котором я выбрал шаблон активности ящика навигации:

К сожалению, этот шаблон работает совсем не так, как в учебнике, и я изо всех сил пытаюсь внести изменения, чтобы получить то, что я хочу.
Макет панели навигации выглядит следующим образом:
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#cccc"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
tools:context="com.example.appname.NavigationDrawerFragment" />
В MainActivity в учебнике вы можете установить drawer_list_item в адаптере mDrawerList:
mPlanetTitles = getResources().getStringArray(R.array.planets_array);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
// Set the adapter for the list view
mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, mPlanetTitles));
// Set the list's click listener
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
В шаблоне все делается иначе:
mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
mTitle = getTitle();
// Set up the drawer.
mNavigationDrawerFragment.setUp(R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout));
Я попытался вручную создать ссылку на макет навигационного ящика и установить адаптер, но все, что произошло, это то, что мои заголовки стали пустыми.
Кому-нибудь удалось это сделать успешно? Будь проклят Google за создание шаблона, который работает совершенно иначе, чем их учебник!
Ответ 1 · MSA
У меня была такая же проблема, вот простой пример на github: добавлен в ящик навигации Адаптер для строки Значок, имя, номер
https://github.com/ManolescuSebastian/Android-Mail-App/tree/master/app/src/main/java/ro/softwareinclude/android_mail_app/adapter
Полезный код, который вам нужен:
Фрагмент NavigationDrawer:
//Pop navigation drawer item list
List<InstantMailNavigationItem> navigationDrawerMapElementsList = new ArrayList<InstantMailNavigationItem>();
String [] navigationItemNameArray= getResources().getStringArray(R.array.instantNavigationItemName);
TypedArray images = getResources().obtainTypedArray(R.array.instantNavigationItemIcon);
for(int i=0;i<5;i++){
InstantMailNavigationItem instantMailNavigationItems = new InstantMailNavigationItem();
instantMailNavigationItems.setItemName(navigationItemNameArray[i]);
instantMailNavigationItems.setItemImageResource(getResources().getDrawable(images.getResourceId(i,-1)));
navigationDrawerMapElementsList.add(instantMailNavigationItems);
}
NavigatorAdapter navigatorAdapter = new NavigatorAdapter(getActionBar().getThemedContext(), navigationDrawerMapElementsList);
mDrawerListView.setAdapter(navigatorAdapter);
Класс адаптера:
public class NavigatorAdapter extends ArrayAdapter {
private Context context;
private ViewHolder holder;
private List<InstantMailNavigationItem> navigationDrawerElements;
public NavigatorAdapter(Context context, List<InstantMailNavigationItem> instantMailNavigationItems) {
super(context, R.layout.navigator_adapter,instantMailNavigationItems);
this.context = context;
this.navigationDrawerElements = instantMailNavigationItems;
}
/**
* getView method is called for each item of ListView
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
InstantMailNavigationItem navigationItem = navigationDrawerElements.get(position);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.navigator_adapter, null);
holder = new ViewHolder();
init(convertView,holder);
holder.navDrawerItemName.setText(navigationItem.getItemName());
holder.navDrawerItemIcon.setImageDrawable(navigationItem.getItemImageResource());
return convertView;
}
public void init(View convertView, ViewHolder holder) {
holder.navDrawerItemIcon = (ImageView) convertView.findViewById(R.id.navDrawerItemIcon);
holder.navDrawerItemName = (TextView) convertView.findViewById(R.id.navDrawerItemName);
holder.navDrawerItemNumber = (TextView) convertView.findViewById(R.id.navDrawerItemNumber);
}
static class ViewHolder{
ImageView navDrawerItemIcon;
TextView navDrawerItemName;
TextView navDrawerItemNumber;
}
}
Ответ 2 · Leon
Хорошо, я нашел ответ, вчера я явно плохо искал.
Настройка панели навигации теперь выполняется в классе фрагментов панели навигации:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
///yada yada yada
mDrawerListView.setAdapter(new ArrayAdapter<String>(getActionBar()
.getThemedContext(), android.R.layout.simple_list_item_1,
android.R.id.text1, new String[] {
getString(R.string.title_section1),
getString(R.string.title_section2),
getString(R.string.title_section3),}));
mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
return mDrawerListView;
}
Поэтому мне просто пришлось изменить свой ресурс макета в ArrayAdapter:
mDrawerListView.setAdapter(new ArrayAdapter<String>(getActionBar()
.getThemedContext(), R.layout.drawer_list_item,
android.R.id.text1, new String[] {