Search code examples
androidandroid-fragmentsdrawerlayoutnavigation-drawer

Unable to get on click particular item of side menu screen


I have used navigation slider menu for side menu screen But unable to get on click particular item in list.I am adding my code. When i am click on the side menu'content it should be open another screen . But unable to open other screen. For a Example : If i am clicking on profile. it is not opening profile screen. & drawerlayout closes without opening screen. See image of side menu's content

MainActivity

 import android.app.ActionBar;
import android.app.Activity;
import android.supoort.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.JsonArrayRequest;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

import info.androidhive.customlistviewvolley.adater.CustomListAdapter;
import info.androidhive.customlistviewvolley.adater.NavDrawerListAdapter;
import info.androidhive.customlistviewvolley.app.AppController;
import info.androidhive.customlistviewvolley.model.About;
import info.androidhive.customlistviewvolley.model.CurrencyConverter;
import info.androidhive.customlistviewvolley.model.EMICalculator;
import info.androidhive.customlistviewvolley.model.Feedback;
import info.androidhive.customlistviewvolley.model.Movie;
import info.androidhive.customlistviewvolley.model.NavDrawerItem;
import info.androidhive.customlistviewvolley.model.PayInstallment;
import info.androidhive.customlistviewvolley.model.Profile;
import info.androidhive.customlistviewvolley.model.Settings;
import info.androidhive.customlistviewvolley.model.SocialFeed;
public class MainActivity extends android.support.v4.app.FragmentActivity {

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

        //  drawer title
        private CharSequence mDrawerTitle;

        // used to store app title
        private CharSequence mTitle;

        // slide menu items
        private String[] navMenuTitles;
        private TypedArray navMenuIcons;

        private ArrayList<NavDrawerItem> navDrawerItems;
        private NavDrawerListAdapter adater ;


        // Log tag
        private static final String TAG = MainActivity.class.getSimpleName();
        // data of json url
        private static final String url = "http://milagro.in/wip/apps/n/THDC2.json";
        private ProgressDialog pDialog;
        private List<Movie> movieList = new ArrayList<Movie>();
        private ListView listView;
        private CustomListAdapter adapter;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            //mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ActionBar actionBar = getActionBar();

            // Enabling Up / Back navigation
            //actionBar.setDisplayHomeAsUpEnabled(true);
            listView = (ListView) findViewById(R.id.list);
            adapter = new CustomListAdapter(this, movieList);
            listView.setAdapter(adapter);
            pDialog = new ProgressDialog(this);
            // Showing progress dialog before making http request
            pDialog.setMessage("Loading...");
            pDialog.show();
            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.drawerLayout);
            mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

            navDrawerItems = new ArrayList<NavDrawerItem>();

            // adding nav drawer items to array
            // Profile
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
            // About
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
            // Emi Calculator
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
            // Currency Converter
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1)));
            // PayInstallments/EMI
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
            // Social Feed
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1)));
            // Feedback
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[6], navMenuIcons.getResourceId(6, -1)));
            //Settings
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[7], navMenuIcons.getResourceId(7, -1)));

            // Recycle the typed array
            navMenuIcons.recycle();

            mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

            // setting the nav drawer list adapter
            adater= new NavDrawerListAdapter(getApplicationContext(),navDrawerItems);
            mDrawerList.setAdapter(adater);

            // enabling action bar app icon and behaving it as toggle button
            getActionBar().setDisplayHomeAsUpEnabled(true);
            getActionBar().setHomeButtonEnabled(true);

            mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,R.drawable.menu, //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) {
                 mDrawerList.bringToFront();
                mDrawerLayout.requestLayout();
                    getActionBar().setTitle(mDrawerTitle);

                    // calling onPrepareOptionsMenu() to hide action bar icons
                    invalidateOptionsMenu();
                }
            };

            mDrawerLayout.setDrawerListener(mDrawerToggle);

            if (savedInstanceState == null) {
                // on first time display view for first nav item
                //displayView(1);
            }
            // Creating volley request obj
            JsonArrayRequest movieReq = new JsonArrayRequest(url,
                    new Response.Listener<JSONArray>() {
                        @Override
                        public void onResponse(JSONArray response) {
                            Log.d(TAG, response.toString());
                            hidePDialog();
                            // Parsing json
                            for (int i = 0; i < response.length(); i++) {
                                try {
                                    JSONObject obj = response.getJSONObject(i);
                                    Movie movie = new Movie();
                                    movie.setTitle(obj.getString("tata_project_name"));
                                    movie.setThumbnailUrl(obj.getString("project_logo_url"));
                                    movie.setParkingUrl(obj.getString("parking"));
                                    movie.setPowerbackupUrl(obj.getString("powerbackup"));
                                    movie.setFitnessUrl(obj.getString("fitness"));
                                    movie.setLiftUrl(obj.getString("lift"));
                                    movie.setParkUrl(obj.getString("park"));
                                    movie.setSecurityUrl(obj.getString("security"));
                                    movie.setSwimmingUrl(obj.getString("swimming"));
                                    movie.setTypology(obj.getString("project_Typology"));
                                    movie.setPrice(obj.getString("price"));
                                    // adding movie to movies array
                                    movieList.add(movie);
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }
                            // notifying list adapter about data changes
                            // so that it renders the list view with updated data
                            adapter.notifyDataSetChanged();
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());
                    hidePDialog();
                }
            });
            // Adding request to request queue
            AppController.getInstance().addToRequestQueue(movieReq);

        }

            private class SlideMenuClickListener implements
            AdapterView.OnItemClickListener {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                                long id) {
            Log.e("MainActivity", "Error in creating fragment");
            //display view for selected nav drawer item

            displayView(position);

            Log.e("MainActivity", "Error in creating fragment12");
        }
    }

        @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
            Fragment fragment = null;
            switch (position) {
                case 0:
                    fragment = new Profile();
                    break;
                case 1:
                    fragment = new About();
                    break;
                case 2:
                    fragment = new EMICalculator();
                    break;
                case 3:
                    fragment = new CurrencyConverter();
                    break;
                case 4:
                    fragment = new PayInstallment();
                    break;
                case 5:
                    fragment = new SocialFeed();
                    break;
                case 6 :
                    fragment =new Feedback();
                    break;
                case 7:
                    fragment =new Settings();
                break;
                default:
                    break;
            }

            if (fragment != null) {
                FragmentManager fragmentManager = getSupportFragmentManager();
                fragmentManager.beginTransaction()
                        .replace(R.id.frame_container, fragment).commit();

                // update selected item and title, then close the drawer
                mDrawerList.setItemChecked(position, true);
                mDrawerList.setSelection(position);
                setTitle(navMenuTitles[position]);
                mDrawerLayout.closeDrawer(mDrawerList);
            } else {
                // error in creating fragment
                Log.e("MainActivity", "Error in creating fragment");
            }
        }
        @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 toggls
            mDrawerToggle.onConfigurationChanged(newConfig);
        }

        public void bottomMenuClick(View v)
        {
            int pos = Integer.parseInt(v.getTag().toString());

            switch (pos)
            {
                case 1: // enquiry screen
                    startActivity(new Intent(MainActivity.this,Enquiry.class));
                    break;
                case 2: // contact screen
                    startActivity(new Intent(MainActivity.this, Contact.class));
                    break;
                case 3: // Instant Call Back screen
                    startActivity(new Intent(MainActivity.this, CallBack.class));
                    break;
            }
        }
        @Override
        public void onDestroy() {
            super.onDestroy();
            hidePDialog();
        }



        private void hidePDialog() {
            if (pDialog != null) {
                pDialog.dismiss();
                pDialog = null;
            }
        }

    }

activity_main

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawerLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"

        xmlns:android="http://schemas.android.com/apk/res/android">


        <LinearLayout
            android:id="@+id/frame_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />

                <ListView
                android:id="@+id/list"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:divider="@color/list_divider"
                android:dividerHeight="1dp"
                android:listSelector="@drawable/list_row_selector"
                android:background="@color/list_background"/>
<ListView
                android:id="@+id/list_slidermenu"
                android:layout_width="240dp"
                android:layout_height="match_parent"
                android:layout_gravity="start"
                android:choiceMode="singleChoice"
                android:divider="@color/list_divider"
                android:dividerHeight="1dp"
                android:listSelector="@drawable/list_selector"
                android:background="@color/list_background"/>

Navdrawerlistadapter.java

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.title);
        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;
    }

}

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;
    }
}

Profile(1st content of side menu ) which is not opening after click.

public class Profile extends Fragment {

    public Profile(){}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.profile, container, false);

        return rootView;
    }
}

profile.xml

<?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="match_parent">

    <TextView
        android:id="@+id/txtLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="16dp"
        android:text="Profile"/>
</RelativeLayout>

Solution

  • Ok, your problem will be solved here.
    You should add these lines:

    mDrawerList.bringToFront();
    mDrawerLayout.requestLayout();
    

    Also please note that SlideMenuClickListener should implement AdapterView.OnItemClickListener, not ListView.OnItemClickListener.

    For future, please consider using NavigationView instead - it's also highly customizable and much easier, as for me.

    Update. As you use support drawer, please try to

    android.support.v4.app.Fragment;
    android.support.v4.app.FragmentManager;
    

    And use then getSupportFragmentManager().
    I believe it should work.

    Update2. Try to do like here:
    remove ListView with @+id/list from main layout, leave there only frame_container and list_slidermenu.

    Update3. Make xml for fragment:

    <?xml version="1.0" encoding="utf-8"?>
        <ListView
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </ListView>
    

    Make class for fragment:

    public class NewFragment extends Fragment {
    
        public NewFragment (){}
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
    
            View rootView = inflater.inflate(R.layout.new_fragment, container, false);
            ListView list = (Listview) rootView.findViewById(R.id.list);
    //then do what you need with this list
            return rootView;
        }
    }
    

    In MainActivity replace container with instance of your NewFragment.