Autore Topic: Naviagation Drawer adapter  (Letto 775 volte)

Offline JCC

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
Naviagation Drawer adapter
« il: 14 Gennaio 2014, 22:59:25 CET »
0
Dal Log ho questo errore, sembra che non trova la TextView?
Codice (Java): [Seleziona]
01-14 13:44:34.079: E/AndroidRuntime(2499): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.widget.AbsListView.obtainView(AbsListView.java:2177)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.widget.ListView.makeAndAddView(ListView.java:1840)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.widget.ListView.fillDown(ListView.java:675)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.widget.ListView.fillFromTop(ListView.java:736)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.widget.ListView.layoutChildren(ListView.java:1655)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.widget.AbsListView.onLayout(AbsListView.java:2012)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.View.layout(View.java:14289)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.ViewGroup.layout(ViewGroup.java:4562)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:714)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.View.layout(View.java:14289)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.ViewGroup.layout(ViewGroup.java:4562)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.View.layout(View.java:14289)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.ViewGroup.layout(ViewGroup.java:4562)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:349)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.View.layout(View.java:14289)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.ViewGroup.layout(ViewGroup.java:4562)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.View.layout(View.java:14289)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.ViewGroup.layout(ViewGroup.java:4562)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1976)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1730)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.Choreographer.doCallbacks(Choreographer.java:562)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.Choreographer.doFrame(Choreographer.java:532)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.os.Handler.handleCallback(Handler.java:730)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.os.Looper.loop(Looper.java:137)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.app.ActivityThread.main(ActivityThread.java:5103)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at java.lang.reflect.Method.invokeNative(Native Method)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at java.lang.reflect.Method.invoke(Method.java:525)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-14 13:44:34.079: E/AndroidRuntime(2499):     at dalvik.system.NativeStart.main(Native Method)
01-14 13:44:34.079: E/AndroidRuntime(2499): Caused by: java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.TextView
01-14 13:44:34.079: E/AndroidRuntime(2499):     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:379)

l'adapter:
Codice (Java): [Seleziona]
public class NavDrawerListAdapter extends BaseAdapter {
       
        private Context context;
        private ArrayList<NavDrawerItem> navDrawerItems;
       
        public NavDrawerListAdapter(Context context, ArrayList<NavDrawerItem> navDrawerItems){
                this.context = context;
                this.navDrawerItems = navDrawerItems;
        }

        @Override
        public int getCount() {
                return navDrawerItems.size();
        }

        @Override
        public Object getItem(int position) {          
                return navDrawerItems.get(position);
        }

        @Override
        public long getItemId(int position) {
                return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                if (convertView == null) {
            LayoutInflater mInflater = (LayoutInflater)
                    context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.drawer_list_item, null);
        }
         
        ImageView imgIcon = (ImageView) convertView.findViewById(R.id.icon);
        TextView txtTitle = (TextView) convertView.findViewById(R.id.text1);
        //TextView txtCount = (TextView) convertView.findViewById(R.id.counter);
         
        imgIcon.setImageResource(navDrawerItems.get(position).getIcon());        
        txtTitle.setText(navDrawerItems.get(position).getTitle());
       
        // displaying count
        // check whether it set visible or not
        if(navDrawerItems.get(position).getCounterVisibility()){
                //txtCount.setText(navDrawerItems.get(position).getCount());
        }else{
                // hide the counter view
                //txtCount.setVisibility(View.GONE);
        }
       
        return convertView;
        }
    }
The class NavDrawerItem:

    public class NavDrawerItem {
       
        private String title;
        private int icon;
        private String count = "0";
        // boolean to set visiblity of the counter
        private boolean isCounterVisible = false;
       
        public NavDrawerItem(){}

        public NavDrawerItem(String title, int icon){
                this.title = title;
                this.icon = icon;
        }
       
        public NavDrawerItem(String title, int icon, boolean isCounterVisible, String count){
                this.title = title;
                this.icon = icon;
                //this.isCounterVisible = isCounterVisible;
                this.count = count;
        }
       
        public String getTitle(){
                return this.title;
        }
       
        public int getIcon(){
                return this.icon;
        }
       
        public String getCount(){
                return this.count;
        }
       
        public boolean getCounterVisibility(){
                return this.isCounterVisible;
        }
       
        public void setTitle(String title){
                this.title = title;
        }
       
        public void setIcon(int icon){
                this.icon = icon;
        }
       
        public void setCount(String count){
                this.count = count;
        }
       
        public void setCounterVisibility(boolean isCounterVisible){
                this.isCounterVisible = isCounterVisible;
        }
    }
nell'activity:
Codice (Java): [Seleziona]
mTitle = mDrawerTitle = getTitle();

                        // load slide menu items
                        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

                        // nav drawer icons from resources
                        navMenuIcons = getResources()
                                        .obtainTypedArray(R.array.nav_drawer_icons);

                        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
                        mDrawerList = (ListView) findViewById(R.id.left_drawer);

                        navDrawerItems = new ArrayList<NavDrawerItem>();
                        // adding nav drawer items to array
                        // Home
                        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
                        // Find People
                        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
                        // Photos
                        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
                        // Communities, Will add a counter here
                        navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1), true, "22"));
                        // Pages
                        navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
                        // What's hot, We  will add a counter here
                        navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), true, "50+"));
                        // Recycle the typed array
                        navMenuIcons.recycle();

                        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
                        // setting the nav drawer list adapter
                        adapter = new NavDrawerListAdapter(getApplicationContext(),
                                        navDrawerItems);
                        mDrawerList.setAdapter(adapter);
                        // enabling action bar app icon and behaving it as toggle button
                        getActionBar().setDisplayHomeAsUpEnabled(true);
                        //getActionBar().setHomeButtonEnabled(true);
                        // if (savedInstanceState == null) {
                           //     selectItem(0);}
                        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                                        R.drawable.ic_drawer, //nav menu toggle icon
                                        R.string.app_name, // nav drawer open - description for accessibility
                                        R.string.app_name // nav drawer close - description for accessibility
                        ) {
                                public void onDrawerClosed(View view) {
                                        getActionBar().setTitle(mTitle);
                                        // calling onPrepareOptionsMenu() to show action bar icons
                                        invalidateOptionsMenu();
                                }
                                public void onDrawerOpened(View drawerView) {
                                        getActionBar().setTitle(mDrawerTitle);
                                        // calling onPrepareOptionsMenu() to hide action bar icons
                                        invalidateOptionsMenu();
                                }
                        };
                       
               
                mDrawerLayout.setDrawerListener(mDrawerToggle);

the listner:

    /**
         * Slide menu item click listener
         * */

        private class SlideMenuClickListener implements
                        ListView.OnItemClickListener {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position,
                                long id) {
                        // display view for selected nav drawer item
                        displayView(position);
                }
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }
       

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                // toggle nav drawer on selecting action bar app icon/title
                if (mDrawerToggle.onOptionsItemSelected(item)) {
                        return true;
                }
                // Handle action bar actions click
                switch (item.getItemId()) {
                case R.id.action_settings:
                        return true;
                default:
                        return super.onOptionsItemSelected(item);
                }
        }
       

        /* *
         * Called when invalidateOptionsMenu() is triggered
         */

        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
                // if nav drawer is opened, hide the action items
                boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
                menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
                return super.onPrepareOptionsMenu(menu);
        }

       
        private void displayView(int position) {
                // update the main content by replacing fragments
                Intent intent = null;

                switch (position) {
                  case 0:
                      Intent a = new Intent(getBaseContext(), MainActivity.class);
                          startActivity(a);
                    break;
                  case 1:
                        Intent b = new Intent(getBaseContext(), Insee.class);
                         startActivity(b);
                           break;
                    case 2:
                        Intent c = new Intent(getBaseContext(), Riele.class);
                         startActivity(c);
                           break;
                       
                    case 3:
                        mDrawerLayout.closeDrawers();
                       
                           break;
                    case 4:
                        Intent e = new Intent(getBaseContext(), Grate.class);
                         startActivity(e);
                           break;
                    case 5:
                        Intent f = new Intent(getBaseContext(), Grarate.class);
                         startActivity(f);
                           break;

                default:
                        break;
                }

               
        }

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

        /**
         * When using the ActionBarDrawerToggle, you must call it during
         * onPostCreate() and onConfigurationChanged()...
         */


        @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 toggls
                mDrawerToggle.onConfigurationChanged(newConfig);
        }
        }
drawer_list_item.xml
Codice (Java): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="48dp"  >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="25dp"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:contentDescription="@string/desc_list_item_icon"
        android:src="@drawable/ic_home" />
   
<TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/icon"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@+id/icon"
        android:gravity="center_vertical"
        android:paddingLeft="5dp"
        android:text="tt"
        android:textSize="18sp" />


</RelativeLayout>

Offline ciccio

  • Utente junior
  • **
  • Post: 65
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Francesco Cervone
  • Sistema operativo:
    Mac OS X 10.9
Re:Naviagation Drawer adapter
« Risposta #1 il: 23 Gennaio 2014, 15:42:53 CET »
0
Se inserissi le righe rimanenti del log magari ti potrei aiutare  :-)