Android 为什么不显示我的Listview?

Android 为什么不显示我的Listview?,android,android-listview,Android,Android Listview,我在android中有一个ListView,并设置了一个自定义适配器。我的问题是,不管适配器和notifyDataSetChanged(),列表视图都不显示任何内容 以下是我的代码:XML: <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" androi

我在android中有一个ListView,并设置了一个自定义适配器。我的问题是,不管适配器和notifyDataSetChanged(),列表视图都不显示任何内容

以下是我的代码: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">

    <LinearLayout 
    android:id="@+id/content"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/list"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:divider="@null" />

</LinearLayout>

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

    <!--   <TextView
          android:id="@+id/empty"
          android:text="TextView" 
          android:layout_height="match_parent"
          android:layout_width="match_parent"
          android:gravity="center"/> -->



   <!-- 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" />"


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

"));
//使url可点击
setMovementMethod(LinkMovementMethod.getInstance());
holder.url.setVisibility(View.VISIBLE);
}否则{
//url为空,请从视图中删除
holder.url.setVisibility(View.GONE);
} 
//用户档案图片
holder.profilePic.setImageUrl(item.getProfilePic(),imageLoader);
//馈送图像
如果(item.getImge()!=null){
holder.feedImageView.setImageUrl(item.getImge(),imageLoader);
holder.feedImageView.setVisibility(View.VISIBLE);
holder.feedImageView
.setResponseObserver(新的FeedImageView.ResponseObserver(){
@凌驾
public void onError(){
} 
@凌驾
onSuccess()上的公共void{
} 
}); 
}否则{
holder.feedImageView.setVisibility(View.GONE);
} 
返回视图;
} 
} 

问题是屏幕上没有显示任何内容。我只能看到一个白色屏幕。我看不到所有的文本视图(在适配器中提到)及其文本。显然我做错了什么,但我不知道是什么。

最后,我解决了问题

这是更新后的代码。我删除了arrayList.clear和feedItems.clear。它们正在清空我的listview

MainActivity.java

package com.sri.vaave;

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.app.Activity;
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.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
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.vaave.adapter.FeedListAdapter;
import com.sri.vaave.app.AppController;
import com.sri.vaave.data.FeedItem;


public class MainActivity extends Activity  {

    private static final String TAG = MainActivity.class.getSimpleName();
    private ListView listView;
    private FeedListAdapter listAdapter;
    private List<FeedItem> feedItems;
    private List<FeedItem> arrayTemplist;
    private String URL_FEED = "http://coherendz.net/vaavefeed1.json";
    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;

    Iterator itr;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        feedItems = new ArrayList<FeedItem>();


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
                buildFeed(0);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

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

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

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

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


            mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
            mDrawerList = (ListView) findViewById(R.id.drawerList);


            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+"));
            // all
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[6], navMenuIcons.getResourceId(6, -1)));

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

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

               mDrawerList.setAdapter(adapter);
               mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

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



            private void populateFeedList() {
          // TODO Auto-generated method stub

            feedItems = getData(0);

            //getData(0);
            populateListView(feedItems); 

    }
            private void populateListView(List dataFeed) {
            // TODO Auto-generated method stub
                          // feedItems = new ArrayList<FeedItem>();
                           listAdapter = new FeedListAdapter(this, dataFeed);
                           listView = (ListView) findViewById(R.id.list);
                           listView.setAdapter(listAdapter);
                           listAdapter.notifyDataSetChanged();          

            }
            /***
             * 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);
            }



            /**
             * 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

                    Toast.makeText(MainActivity.this,navMenuTitles[position]+" was selected", Toast.LENGTH_LONG).show();
                    setTitle(navMenuTitles[position]);
                    displayView(position);
                    mDrawerLayout.closeDrawer(mDrawerList);
                }

                private void displayView(int position) {
                    // TODO Auto-generated method stub
                    feedItems = new ArrayList<FeedItem>();
                    switch(position){

                    case 0: try {
                            buildFeed(0);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                            break;        
                    case 1: try {
                            buildFeed(7);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                            break;
                    case 2: try {
                            buildFeed(1);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                            break;
                    case 3: try {
                            buildFeed(13);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                            break;
                    case 4: try {
                            buildFeed(12);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                            break;        
                    default:
                        try {
                            buildFeed(0);
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        break;
                    }
                }
            }


                private List getData(int nodeType) {

                // TODO Auto-generated method stub

                    // We first check for cached request 
                       Cache cache = AppController.getInstance().getRequestQueue().getCache(); 
                        Entry entry = cache.get(URL_FEED);
                        String data = null;
                        if (entry != null) { 
                            // fetch the data from cache 
                            try { 
                                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);

                       }

                        return feedItems;
                    }          

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

                        FeedItem item;
                        itr = response.keys();
                        try 
                      {     
                        while(itr.hasNext())

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

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



                                item = new FeedItem();
                                item.setNode_type(nodetype); 
                                item.setName(String.valueOf(name));               
                                item.setStatus(String.valueOf(description)); 
                                item.setReadable_date(String.valueOf(readable_date));
                                item.setComments_count(String.valueOf(comments_count));
                                item.setLike_count(String.valueOf(like_count));


                                feedItems.add(item);

                            }                

                          } 
                          catch (JSONException e) 
                          {
                                e.printStackTrace(); 
                          } 
                     }

            /**
             * 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);
            }


            @Override
            public boolean onOptionsItemSelected(MenuItem item) {
                // TODO Auto-generated method stub
                // 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);
                }
            }

            @Override
            public boolean onCreateOptionsMenu(Menu menu) {
                // TODO Auto-generated method stub
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
            }

            private void buildFeed(int nodeType) throws JSONException {
            // TODO Auto-generated method stub

            getData(0);

            arrayTemplist = new ArrayList<FeedItem>();

                if(nodeType!=0){

                     for(int x=0;x<feedItems.size();x++)
                    {

                      int currentNodeType = feedItems.get(x).getNode_type();

                        if (nodeType == currentNodeType)
                        {
                            arrayTemplist.add(feedItems.get(x));                  
                        }

                    }

                feedItems = arrayTemplist;

                }
                else{

                }

                populateListView(feedItems);
       }            
}
package com.sri.vaave;
导入java.io.UnsupportedEncodingException;
导入java.util.ArrayList;
导入java.util.Iterator;
导入java.util.List;
导入org.json.JSONException;
导入org.json.JSONObject;
导入android.app.Activity;
导入android.content.res.Configuration;
导入android.content.res.TypedArray;
导入android.graphics.Color;
导入android.graphics.drawable.ColorDrawable;
导入android.os.Bundle;
导入android.support.v4.app.ActionBarDrawerToggle;
导入android.support.v4.widget.DrawerLayout;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.ListView;
导入android.widget.Toast;
导入com.android.volley.Cache;
导入com.android.volley.Cache.Entry;
导入com.android.volley.Request.Method;
导入com.android.volley.Response;
导入com.android.volley.VolleyError;
导入com.android.volley.VolleyLog;
导入com.android.volley.toolbox.JsonObjectRequest;
导入com.sri.vaave.adapter.FeedListAdapter;
导入com.sri.vaave.app.AppController;
导入com.sri.vaave.data.FeedItem;
公共类MainActivity扩展了活动{
私有静态最终字符串标记=MainActivity.class.getSimpleName();
私有列表视图列表视图;
专用FeedListAdapter;
私人物品清单;
私有列表arrayTemplist;
专用字符串URL_提要=”http://coherendz.net/vaavefeed1.json";
私人抽屉布局mDrawerLayout;
私有列表视图mDrawerList;
私有操作bardrawertoggle mDrawerToggle;
私人ArrayList NavWrites;
专用型雷达导航仪;
专用导航适配器;
//导航抽屉标题
私有字符序列mDrawerTitle;
//用于存储应用程序标题
私有字符序列mTitle;
//幻灯片菜单项
私有字符串[]navMenuTitles;
迭代器itr;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
feedItems=新的ArrayList();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
试一试{
buildFeed(0);
}捕获(JSONException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
getActionBar().setHomeButtonEnabled(true);
getActionBar().setDisplayHomeAsUpEnabled(true);
//这两条线不需要,,
//只是为了获得facebook的外观(更改背景颜色并隐藏图标)
getActionBar().setBackgroundDrawable(新的ColorDrawable(Color.parseColor(“#3b5998”));
getActionBar().setIcon(
新的ColorDrawable(getResources().getColor(android.R.color.transparent));
mTitle=mDrawerTitle=getTitle();
NavMenuTiles=getResources().getStringArray(R.array.Options);
//参考资料中的导航抽屉图标
navMenuIcons=getResources()
.obtainTypedArray(R.array.nav_drawer_图标);
mDrawerLayout=(抽屉布局)findViewById(R.id.DroperLayout);
mDrawerList=(ListView)findViewById(R.id.DroperList);
navDrawerItems=新的ArrayList();
//将导航抽屉项添加到阵列
//家
添加(新的NavDrawerItem(navMenuTitles[0],navMenuIcons.getResourceId(0,-1));
//找人
添加(新的NavDrawerItem(navMenuTitles[1],navMenuIcons.getResourceId(1,-1));
//照片
添加(新的NavDrawerItem(navMenuTitles[2],navMenuIcons.getResourceId(2,-1));
//社区,将在此处添加一个计数器
添加(新的NavDrawerItem(navMenuTitles[3],navMenuIcons.getResourceId(3,-1),true,“22”);
//页数
add(新的NavDrawerItem(navMenuTitles[4],navMenuIcons.getResourceId(4,-1));
//什么是热的,我们将在这里加一个计数器
add(新的NavDrawerItem(navMenuTitles[5],navMenuIcons.getResourceId(5,-1),true,“50+”));
//全部
添加新的navDrawerItems(navMenuTitles[6
package com.sri.vaave.adapter;

import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.text.Html;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;
import com.sri.vaave.FeedImageView;
import com.sri.vaave.R;
import com.sri.vaave.app.AppController;
import com.sri.vaave.data.FeedItem;

public class FeedListAdapter extends BaseAdapter {  
    private Activity activity;
    private LayoutInflater inflater;
    private List<FeedItem> feedItems;
    ImageLoader imageLoader = AppController.getInstance().getImageLoader();

    public FeedListAdapter(Activity activity, List<FeedItem> feedItems) {
        this.activity = activity;
        this.feedItems = feedItems;
    } 



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

    @Override 
    public Object getItem(int location) {
        return feedItems.get(location);
    } 

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

    class MyViewHolder{


        TextView name,timestamp,statusMsg,url;
        NetworkImageView profilePic;
        FeedImageView feedImageView;

        @SuppressWarnings("unused")
        MyViewHolder(View v){

            TextView name = (TextView) v.findViewById(R.id.name);
            TextView timestamp = (TextView) v
                    .findViewById(R.id.timestamp);
            TextView statusMsg = (TextView) v
                    .findViewById(R.id.txtStatusMsg);
            TextView url = (TextView)v.findViewById(R.id.txtUrl);
            NetworkImageView profilePic = (NetworkImageView) v
                    .findViewById(R.id.profilePic);
            FeedImageView feedImageView = (FeedImageView) v
                    .findViewById(R.id.feedImage1);

        }


    }

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


        MyViewHolder holder = null;

        if (inflater == null)
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
        {
            convertView = inflater.inflate(R.layout.feed_item, null);
            holder = new MyViewHolder(convertView);
            convertView.setTag(holder);
        }

        else
        {

        holder = (MyViewHolder) convertView.getTag();

        }
        if (imageLoader == null)
            imageLoader = AppController.getInstance().getImageLoader();


        FeedItem item = feedItems.get(position);

        holder.name.setText(item.getName());

        // Converting timestamp into x ago format 
        /*CharSequence timeAgo = DateUtils.getRelativeTimeSpanString(
                Long.parseLong(item.getReadable_date()),
                System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS);*/
        holder.timestamp.setText(item.getReadable_date());

        // Chcek for empty status message 
        if (!TextUtils.isEmpty(item.getStatus())) { 
            holder.statusMsg.setText(Html.fromHtml(item.getStatus()));
            holder.statusMsg.setVisibility(View.VISIBLE);
        } else { 
            // status is empty, remove from view 
            holder.statusMsg.setVisibility(View.GONE); 
        } 

        // Checking for null feed url 
        if (item.getUrl() != null) { 
            holder.url.setText(Html.fromHtml("<a href=\"" + item.getUrl() + "\">"
                    + item.getUrl() + "</a> "));

            // Making url clickable 
            holder.url.setMovementMethod(LinkMovementMethod.getInstance());
            holder.url.setVisibility(View.VISIBLE);
        } else { 
            // url is null, remove from the view 
            holder.url.setVisibility(View.GONE); 
        } 

        // user profile pic 
        holder.profilePic.setImageUrl(item.getProfilePic(), imageLoader);

        // Feed image 
        if (item.getImge() != null) { 
            holder.feedImageView.setImageUrl(item.getImge(), imageLoader);
            holder.feedImageView.setVisibility(View.VISIBLE);
            holder.feedImageView 
                    .setResponseObserver(new FeedImageView.ResponseObserver() { 
                        @Override 
                        public void onError() { 
                        } 

                        @Override 
                        public void onSuccess() { 
                        } 
                    }); 
        } else { 
            holder.feedImageView.setVisibility(View.GONE); 
        } 

        return convertView; 
    } 

} 
package com.sri.vaave;

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.app.Activity;
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.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
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.vaave.adapter.FeedListAdapter;
import com.sri.vaave.app.AppController;
import com.sri.vaave.data.FeedItem;


public class MainActivity extends Activity  {

    private static final String TAG = MainActivity.class.getSimpleName();
    private ListView listView;
    private FeedListAdapter listAdapter;
    private List<FeedItem> feedItems;
    private List<FeedItem> arrayTemplist;
    private String URL_FEED = "http://coherendz.net/vaavefeed1.json";
    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;

    Iterator itr;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub

        feedItems = new ArrayList<FeedItem>();


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
                buildFeed(0);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

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

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

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

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


            mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
            mDrawerList = (ListView) findViewById(R.id.drawerList);


            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+"));
            // all
            navDrawerItems.add(new NavDrawerItem(navMenuTitles[6], navMenuIcons.getResourceId(6, -1)));

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

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

               mDrawerList.setAdapter(adapter);
               mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

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



            private void populateFeedList() {
          // TODO Auto-generated method stub

            feedItems = getData(0);

            //getData(0);
            populateListView(feedItems); 

    }
            private void populateListView(List dataFeed) {
            // TODO Auto-generated method stub
                          // feedItems = new ArrayList<FeedItem>();
                           listAdapter = new FeedListAdapter(this, dataFeed);
                           listView = (ListView) findViewById(R.id.list);
                           listView.setAdapter(listAdapter);
                           listAdapter.notifyDataSetChanged();          

            }
            /***
             * 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);
            }



            /**
             * 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

                    Toast.makeText(MainActivity.this,navMenuTitles[position]+" was selected", Toast.LENGTH_LONG).show();
                    setTitle(navMenuTitles[position]);
                    displayView(position);
                    mDrawerLayout.closeDrawer(mDrawerList);
                }

                private void displayView(int position) {
                    // TODO Auto-generated method stub
                    feedItems = new ArrayList<FeedItem>();
                    switch(position){

                    case 0: try {
                            buildFeed(0);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                            break;        
                    case 1: try {
                            buildFeed(7);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                            break;
                    case 2: try {
                            buildFeed(1);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                            break;
                    case 3: try {
                            buildFeed(13);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                            break;
                    case 4: try {
                            buildFeed(12);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                            break;        
                    default:
                        try {
                            buildFeed(0);
                        } catch (JSONException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        break;
                    }
                }
            }


                private List getData(int nodeType) {

                // TODO Auto-generated method stub

                    // We first check for cached request 
                       Cache cache = AppController.getInstance().getRequestQueue().getCache(); 
                        Entry entry = cache.get(URL_FEED);
                        String data = null;
                        if (entry != null) { 
                            // fetch the data from cache 
                            try { 
                                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);

                       }

                        return feedItems;
                    }          

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

                        FeedItem item;
                        itr = response.keys();
                        try 
                      {     
                        while(itr.hasNext())

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

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



                                item = new FeedItem();
                                item.setNode_type(nodetype); 
                                item.setName(String.valueOf(name));               
                                item.setStatus(String.valueOf(description)); 
                                item.setReadable_date(String.valueOf(readable_date));
                                item.setComments_count(String.valueOf(comments_count));
                                item.setLike_count(String.valueOf(like_count));


                                feedItems.add(item);

                            }                

                          } 
                          catch (JSONException e) 
                          {
                                e.printStackTrace(); 
                          } 
                     }

            /**
             * 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);
            }


            @Override
            public boolean onOptionsItemSelected(MenuItem item) {
                // TODO Auto-generated method stub
                // 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);
                }
            }

            @Override
            public boolean onCreateOptionsMenu(Menu menu) {
                // TODO Auto-generated method stub
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
            }

            private void buildFeed(int nodeType) throws JSONException {
            // TODO Auto-generated method stub

            getData(0);

            arrayTemplist = new ArrayList<FeedItem>();

                if(nodeType!=0){

                     for(int x=0;x<feedItems.size();x++)
                    {

                      int currentNodeType = feedItems.get(x).getNode_type();

                        if (nodeType == currentNodeType)
                        {
                            arrayTemplist.add(feedItems.get(x));                  
                        }

                    }

                feedItems = arrayTemplist;

                }
                else{

                }

                populateListView(feedItems);
       }            
}