未从导航抽屉单击侦听器加载碎片

时间:2014-10-14 19:42:28

标签: android android-fragments android-listview android-navigation

Android OnItemClickListener无效。我已经研究了一些以前类似的问题,我找不到解决问题的方法。

我在Logcat中找到 Log.d(" TAG","项目点击工作"); 但我无法打开新片段

我附上以下代码。

**MainActivity**

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.json.JSONException;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Cache;
import com.android.volley.Cache.Entry;
import com.android.volley.Request.Method;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.JsonObjectRequest;
import com.sri.vaavefeed.adapter.FeedListAdapter;
import com.sri.vaavefeed.app.AppController;
import com.sri.vaavefeed.data.FeedItem;

public class MainActivity extends Activity implements OnItemClickListener
{
    private static final String TAG = MainActivity.class.getSimpleName();
    private ListView listView;
    private FeedListAdapter listAdapter;
    private List<FeedItem> feedItems;
    private String URL_FEED = "http://coherendz.net/vaavefeed1.json";
    int node_type;
    FeedItem item;
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;
    private ArrayList<NavDrawerItem> navDrawerItems;
    private TypedArray navMenuIcons;
    private NavDrawerListAdapter adapter;

    // nav drawer title
    private CharSequence mDrawerTitle;

    // used to store app title
    private CharSequence mTitle;

    // slide menu items
    private String[] navMenuTitles;
    private myAdapter myadapter;
    private int node_id;
    private String comments_count;
    private String like_count;
    private String readable_date;
    private String name;
    private String description;


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



        mTitle = mDrawerTitle = getTitle();
        navMenuTitles = getResources().getStringArray(R.array.Options);

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

        listView = (ListView) findViewById(R.id.list);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
        mDrawerList = (ListView) findViewById(R.id.drawerList);
        mDrawerList.setItemsCanFocus(true);
        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());


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


        feedItems = new ArrayList<FeedItem>();

        listAdapter = new FeedListAdapter(this, feedItems);
        listView.setAdapter(listAdapter);

        // These two lines not needed, 
        // just to get the look of facebook (changing background color & hiding the icon)

        getActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#3b5998"))); 
        getActionBar().setIcon( 
                   new ColorDrawable(getResources().getColor(android.R.color.transparent))); 

        // We first check for cached request 
        Cache cache = AppController.getInstance().getRequestQueue().getCache(); 
        Entry entry = cache.get(URL_FEED); 
        if (entry != null) { 
            // fetch the data from cache 
            try { 
                String data = new String(entry.data, "UTF-8"); 
                try { 
                    parseJsonFeed(new JSONObject(data)); 
                } catch (JSONException e) { 
                    e.printStackTrace(); 
                } 
            } catch (UnsupportedEncodingException e) { 
                e.printStackTrace(); 
            } 

        } else { 
            // making fresh volley request and getting json 
            JsonObjectRequest jsonReq = new JsonObjectRequest(Method.GET, 
                    URL_FEED, null, new Response.Listener<JSONObject>() { 

                        @Override 
                        public void onResponse(JSONObject response) { 
                            VolleyLog.d(TAG, "Response: " + response.toString()); 
                            if (response != null) { 
                                parseJsonFeed(response); 
                            } 
                        } 
                    }, new Response.ErrorListener() { 

                        @Override 
                        public void onErrorResponse(VolleyError error) { 
                            VolleyLog.d(TAG, "Error: " + error.getMessage()); 
                        } 
                    }); 

            // Adding request to volley request queue 
            AppController.getInstance().addToRequestQueue(jsonReq); 
        }


        mTitle = mDrawerTitle = getTitle();

        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();

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

         /*  myadapter = new myAdapter(this);*/
           mDrawerList.setAdapter(adapter);




        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, //nav menu toggle icon
                R.string.drawer_open, // nav drawer open - description for accessibility
                R.string.drawer_close // 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);

        if (savedInstanceState == null) {
            // on first time display view for first nav item
            displayView(0);
        }
    }

    /** 
     * Parsing json reponse and passing the data to feed view list adapter 
     * */ 
    private void parseJsonFeed(JSONObject response) {

        @SuppressWarnings("rawtypes")
        Iterator itr = response.keys();
        int i = 0;

      try 
      {     
        while(itr.hasNext())

        {
                String key = itr.next().toString();
                JSONObject entry = response.getJSONObject(key);

                JSONObject phone = entry.getJSONObject("basic");
                name = phone.getString("title");
                description = phone.getString("description");
                node_type = phone.getInt("node_type");
                node_id = phone.getInt("node_id");
                JSONObject comments = entry.getJSONObject("comments");
                comments_count = comments.getString("count");
                JSONObject like = entry.getJSONObject("likes");
                like_count = like.getString("count");
                readable_date = phone.getString("readable_date");


                item = new FeedItem();
                item.setId(node_id); 
                item.setName(name);               
                item.setStatus(description); 
                item.setReadable_date(readable_date);
                item.setComments_count(comments_count);
                item.setLike_count(like_count);

                i++;


                // Image might be null sometimes 
                String image = response.isNull("image") ? null : response 
                        .getString("image"); 


                // url might be null sometimes 
                String feedUrl = response.isNull("url") ? null : response 
                        .getString("url");

                /*item.setUrl(feedUrl);*/ 
                item.setUrl(feedUrl);
                feedItems.add(item); 
            } 

            // notify data changes to list adapater 
            listAdapter.notifyDataSetChanged();

        } 
      catch (JSONException e) 
      {
            e.printStackTrace(); 
      } 
  }
        /**
         * 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

                //Log.d("Kanth", "Item Click Working");
                Toast.makeText(MainActivity.this,navMenuTitles[position]+"was selected", Toast.LENGTH_LONG).show();
                displayView(position);
            }
        }

        /**
         * Diplaying fragment view for selected nav drawer list item
         * */
        private void displayView(int position) {
            // update the main content by replacing fragments
            Fragment fragment = null;
            switch (position) 
            { 
            case 0:
                fragment = new HomeFragment();
                Bundle data = new Bundle();
                data.putInt("id", node_id);
                data.putString("name", name);
                data.putString("description", description);
                data.putString("readable_date", readable_date);
                data.putString("Comments_count", comments_count);
                data.putString("Like_count", like_count);
                fragment.setArguments(data);
                Log.d("Kanth", "Item Click Working");
                break;
            case 1:
                fragment = new FindPeopleFragment();
                break;
            case 2:
                fragment = new PhotosFragment();
                break;
            case 3:
                fragment = new CommunityFragment();
                break;
            case 4:
                fragment = new PagesFragment();
                break;
            case 5:
                fragment = new WhatsHotFragment();
                break;
            default:
                break;
            }

            if (fragment != null) {
                FragmentManager fragmentManager = getFragmentManager();
                fragmentManager.beginTransaction()
                        .replace(R.id.mainContent, 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 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);
            }

            @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

<?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"
    android:clickable="false"
    android:descendantFocusability="blocksDescendants"
    android:focusable="false"
    android:focusableInTouchMode="false"
    >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="25dp"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="12dp"
        android:layout_marginRight="12dp"
        android:contentDescription="@string/desc_list_item_icon"
        android:src="@drawable/ic_launcher"
        android:layout_centerVertical="true" 
        android:clickable="false"
        android:focusable="false"
        android:focusableInTouchMode="false"/>

    <TextView android:id="@+id/counter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/counter_bg"
        android:layout_alignParentRight="true"
        android:layout_marginRight="8dp"
        android:textColor="#000000"
        android:layout_centerHorizontal="true"
        android:clickable="false"
        android:focusable="false"
        android:focusableInTouchMode="false"/>

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="57dp"
        android:layout_toRightOf="@+id/icon"
        android:paddingRight="20dp"
        android:paddingTop="5dp"
        android:text="Hello"
        android:layout_centerHorizontal="true"
        android:textColor="#FFFFFF" 
        android:clickable="false"
        android:focusable="false"
        android:focusableInTouchMode="false"/>

</RelativeLayout>

activity_main.xml中

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

   <FrameLayout 
    android:id="@+id/mainContent"
    android:layout_height="match_parent"
    android:layout_width="match_parent">    
   </FrameLayout>

   <!-- navigation drawer -->
   <ListView
        android:id="@+id/drawerList"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:divider="@null"
        android:descendantFocusability="beforeDescendants"
        android:listSelector="#FFFFFF"
        android:background="#3b5998"
        android:layout_gravity="left" />"

<LinearLayout 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:listSelector="#000000"
        android:divider="@null" />

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

图片

2 个答案:

答案 0 :(得分:0)

您的clickListener无用。您没有将其设置为ListView。您应该使用listView.setOnClickListener()方法。像这样:

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



    mTitle = mDrawerTitle = getTitle();
    navMenuTitles = getResources().getStringArray(R.array.Options);

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

    listView = (ListView) findViewById(R.id.list);
    //////// Setting clickListener
    listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // Here do whatever you want.. 
        }
        });
    ////////
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
    mDrawerList = (ListView) findViewById(R.id.drawerList);
    mDrawerList.setItemsCanFocus(true);
    mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
    ...

答案 1 :(得分:0)

另一个LinearLayout隐藏了Fragment内容。 Fragment正在加载。如果不需要listview,则需要在该Linear布局中加载内容,并删除额外的Frame布局。