Can't use Volley to display two custom ListViews

I am a beginner in android and I am trying to use Volley to create a custom list that contains a list of images and a text description for each. There are two kinds of activities: list view, load json data using volley, use OnItemClickListener to start another activity. the first action is complete to run, when I click another, Logcat got nothing to show, but in the second Listview mode, the empty title only has the title ... This is Logcat, is it not useful or not.

My whole Logcat

05-22 16:09:32.549: V/Monotype(14980): SetAppTypeFace- try to flip, app = com.wangjian.klmeet_sightseeing
05-22 16:09:32.550: V/Monotype(14980):     Typeface getFontPathFlipFont - systemFont = default
05-22 16:09:33.378: D/Volley(14980): [1] 2.onErrorResponse: MainActivity

      

my code looks like this:

First SightseeingActivity.java

public class SightseeingActivity extends Activity {
//Log tag
private static final String TAG = SightseeingActivity.class.getSimpleName();

//Sightseeing json url
private static final String url = "http://wangjian.site90.net/json/api_klmeet_sightseeing.json";
private ProgressDialog pDialog;
private List<Sight> sightList = new ArrayList<Sight>();
private ListView listView;
private CustomListAdapter adapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.sightseeing_activity);

    listView = (ListView) findViewById(R.id.sight_list);
    adapter = new CustomListAdapter(this, sightList);
    listView.setAdapter(adapter);

    pDialog = new ProgressDialog(this);
    // Showing progress dialog before making http request
    pDialog.setMessage("Loading...");
    pDialog.show();

    //changing action bar color
    getActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#1b1b1b")));

    //Creating volley request obj
    JsonArrayRequest sightReq = new JsonArrayRequest(url,new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response){
            Log.d(TAG, response.toString());
            pDialog.dismiss();

            for (int i = 0; i < response.length(); i++){
                try{
                    JSONObject obj = response.getJSONObject(i);
                    Sight sight = new Sight();
                    sight.setTitle(obj.getString("title"));
                    sight.setThumbnailUrl(obj.getString("image"));
                    sight.setReadmore(obj.getString("readmore"));
                    sight.setPreintroduce(obj.getString("preintroduce"));
                    sight.setTag(obj.getString("tag"));

                    sightList.add(sight);
                } 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());
        }
    });
    // Adding request to request queue
            AppController.getInstance().addToRequestQueue(sightReq);
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    Class<? extends Activity> activityToSrart = null;
                    switch (position){
                    case 0:
                        activityToSrart = MainActivity.class;
                        break;
                    case 1:
                        activityToSrart = MerdekaSquare.class;
                        break;
                    }

                    Intent i = new Intent(getApplicationContext(), activityToSrart);
                    startActivity(i);
                }

            });
    }

 }

      

Second Activity MainActivity

public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();
private ListView listView;
private FeedListAdapter listAdapter;
private List<FeedItem> feedItems;
private String URL_FEED = "http://wangjian.site90.net/json/api_klmeet_sightseeing_face.json";

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

    listView = (ListView) findViewById(R.id.list);

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

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

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

}

/**
 * Parsing json reponse and passing the data to feed view list adapter
 * */
private void parseJsonFeed(JSONObject response) {
    try {
        JSONArray feedArray = response.getJSONArray("feed");

        for (int i = 0; i < feedArray.length(); i++) {
            JSONObject feedObj = (JSONObject) feedArray.get(i);

            FeedItem item = new FeedItem();
            item.setId(feedObj.getInt("id"));
            item.setName(feedObj.getString("name"));

            // Image might be null sometimes
            String image = feedObj.isNull("image") ? null : feedObj
                    .getString("image");
            item.setImge(image);
            item.setStatus(feedObj.getString("status"));
            item.setProfilePic(feedObj.getString("profilePic"));
            item.setTimeStamp(feedObj.getString("timeStamp"));

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

            feedItems.add(item);
        }

        // notify data changes to list adapater
        listAdapter.notifyDataSetChanged();
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
    }
}

      

i will load more code as needed. FeedListAdapter.java

@SuppressLint("InflateParams")
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;
}

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

    if (inflater == null)
        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null)
        convertView = inflater.inflate(R.layout.feed_item, null);

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

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

    FeedItem item = feedItems.get(position);

    name.setText(item.getName());

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

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

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

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

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

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

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

    return convertView;
    }

}

      

FeedIteam

package com.wangjian.klmeet_sightseeing.model;

public class FeedItem {
private int id;
private String name, status, image, profilePic, timeStamp, url;

public FeedItem() {
}

public FeedItem(int id, String name, String image, String status,
        String profilePic, String timeStamp, String url) {
    super();
    this.id = id;
    this.name = name;
    this.image = image;
    this.status = status;
    this.profilePic = profilePic;
    this.timeStamp = timeStamp;
    this.url = url;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getImge() {
    return image;
}

public void setImge(String image) {
    this.image = image;
}

public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}

public String getProfilePic() {
    return profilePic;
}

public void setProfilePic(String profilePic) {
    this.profilePic = profilePic;
}

public String getTimeStamp() {
    return timeStamp;
}

public void setTimeStamp(String timeStamp) {
    this.timeStamp = timeStamp;
}

public String getUrl() {
    return url;
}

public void setUrl(String url) {
    this.url = url;
   }
}

      

load XML file if needed

feed_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/feed_bg"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginLeft="@dimen/feed_item_margin"
        android:layout_marginRight="@dimen/feed_item_margin"
        android:layout_marginTop="@dimen/feed_item_margin"
        android:background="@drawable/bg_parent_rounded_corner"
        android:orientation="vertical"
        android:paddingBottom="@dimen/feed_item_padding_top_bottom"
        android:paddingTop="@dimen/feed_item_padding_top_bottom" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:paddingLeft="@dimen/feed_item_padding_left_right"
            android:paddingRight="@dimen/feed_item_padding_left_right" >

            <com.android.volley.toolbox.NetworkImageView
                android:id="@+id/profilePic"
                android:layout_width="@dimen/feed_item_profile_pic"
                android:layout_height="@dimen/feed_item_profile_pic"
                android:scaleType="fitCenter" >
            </com.android.volley.toolbox.NetworkImageView>

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:paddingLeft="@dimen/feed_item_profile_info_padd" >

                <TextView
                    android:id="@+id/name"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:textSize="@dimen/feed_item_profile_name"
                    android:textStyle="bold" />

                <TextView
                    android:id="@+id/timestamp"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:textColor="@color/timestamp"
                    android:textSize="@dimen/feed_item_timestamp" />
            </LinearLayout>
        </LinearLayout>

        <TextView
            android:id="@+id/txtStatusMsg"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="5dp"
            android:paddingLeft="@dimen/feed_item_status_pad_left_right"
            android:paddingRight="@dimen/feed_item_status_pad_left_right"
            android:paddingTop="@dimen/feed_item_status_pad_top" />

        <TextView
            android:id="@+id/txtUrl"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:linksClickable="true"
            android:paddingBottom="10dp"
            android:paddingLeft="@dimen/feed_item_status_pad_left_right"
            android:paddingRight="@dimen/feed_item_status_pad_left_right"
            android:textColorLink="@color/link" />

        <info.androidhive.listviewfeed.FeedImageView
            android:id="@+id/feedImage1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/white"
            android:scaleType="fitXY"
            android:visibility="visible" />
    </LinearLayout>

</LinearLayout>
      

Run codeHide result


This is my first action ** This is my first activity **

the second should be like this ** the second one should be like this **

But ** But **

Json

{
    "feed": [
        {
            "id": 1,
            "name": "National Geographic Channel",
            "image": "http://api.androidhive.info/feed/img/cosmos.jpg",
            "status": "\"Science is a beautiful and emotional human endeavor,\" says Brannon Braga, executive producer and director. \"And Cosmos is all about making science an experience.\"",
            "profilePic": "http://wangjian.site90.net/json/klcc.jpg",
            "timeStamp": "1403375851930",
            "url": null
        },
        {
            "id": 2,
            "name": "TIME",
            "image": "http://api.androidhive.info/feed/img/time_best.jpg",
            "status": "30 years of Cirque du Soleil best photos",
            "profilePic": "http://wangjian.site90.net/json/klcc.jpg,
            "timeStamp": "1403375851930",
            "url": "http://ti.me/1qW8MLB"
        },
        {
            "id": 5,
            "name": "Abraham Lincoln",
            "image": null,
            "status": "That some achieve great success, is proof to all that others can achieve it as well",
            "profilePic": "http://wangjian.site90.net/json/klcc.jpg",
            "timeStamp": "1403375851930",
            "url": null
        },
        {
            "id": 3,
            "name": "Discovery",
            "image": "http://api.androidhive.info/feed/img/discovery_mos.jpg",
            "status": "A team of Austrian scientists has developed a laser system that causes fruit flies to dance.",
            "profilePic": "http://wangjian.site90.net/json/klcc.jpg",
            "timeStamp": "1403375851930",
            "url": "http://dsc.tv/xmMxD"
        },
        {
            "id": 4,
            "name": "Ravi Tamada",
            "image": "http://api.androidhive.info/feed/img/nav_drawer.jpg",
            "status": "Android Sliding Menu using Navigation Drawer",
            "profilePic": "http://wangjian.site90.net/json/klcc.jpg",
            "timeStamp": "1403375851930",
            "url": "http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/"
        },
        {
            "id": 6,
            "name": "KTM",
            "image": "http://api.androidhive.info/feed/img/ktm_1290.jpg",
            "status": "\"The Beast\" KTM 1290 Super Duke",
            "profilePic": "http://wangjian.site90.net/json/klcc.jpg",
            "timeStamp": "1403375851930",
            "url": ""
        },
        {
            "id": 7,
            "name": "Harley-Davidson",
            "image": "http://api.androidhive.info/feed/img/harley_bike.jpg",
            "status": "WeΓƒΒ’Γ’β€šΒ¬Γ’β€žΒ’re assembling riders of every style, bike, and passion. If you ride with conviction, ride with us. You have 24 days to get ready for World Ride. Prepare by visiting:",
            "profilePic": "http://wangjian.site90.net/json/klcc.jpg",
            "timeStamp": "1403375851930",
            "url": "http://bit.ly/1wmBWaN"
        },
        {
            "id": 8,
            "name": "Rock & Girl",
            "image": "http://api.androidhive.info/feed/img/rock.jpg",
            "status": "A long time back...",
            "profilePic": "http://wangjian.site90.net/json/klcc.jpg",
            "timeStamp": "1403375851930",
            "url": ""
        },
        {
            "id": 8,
            "name": "Gandhi",
            "image": null,
            "status": "An eye for an eye will make the whole world blind.",
            "profilePic": "http://wangjian.site90.net/json/klcc.jpg",
            "timeStamp": "1403375851930",
            "url": ""
        },
        {
            "id": 9,
            "name": "LIFE",
            "image": "http://api.androidhive.info/feed/img/life_photo.jpg",
            "status": "In 1965, LIFE photographer Bill Ray spent weeks with the Hells Angels, but his amazing photos never ran in the magazine",
            "profilePic": "http://wangjian.site90.net/json/klcc.jpg",
            "timeStamp": "1403375851930",
            "url": "http://ti.me/1rfcQa4"
        },
        {
            "id": 10,
            "name": "Shakira",
            "image": "http://api.androidhive.info/feed/img/shakira_la_la.png",
            "status": "Download La La La (Brazil 2014) from iTunes:",
            "profilePic": "http://wangjian.site90.net/json/klcc.jpg",
            "timeStamp": "1403375851930",
            "url": "http://smarturl.it/FWCalbum?IQid=sh"
        },
        {
            "id": 11,
            "name": "A. R. rahman",
            "image": "http://api.androidhive.info/feed/img/ar_bw.jpg",
            "status": "",
            "profilePic": "http://wangjian.site90.net/json/klcc.jpg",
            "timeStamp": "1403375851930",
            "url": ""
        }
    ]
}
      

Run codeHide result


I am new to this, so any help would be appreciated. Thanks in Advance.!

+3


source to share


1 answer


First, it doesn't exist private String URL_FEED = "http://wangjian.site90.net/json/api_klmeet_sightseeing_face.json";

in MainActivity , and when I tried it in AdvanceRestClient

I got this:

enter image description here

So, I tried to look more into the directory structure of your WS and found that there is no such url you mentioned above.

enter image description here



Also, I am having security issues when trying to access your directory:

enter image description here

I'm not sure what you are looking for serious, but you can try with the actual URL

in MainActivity

, and it should work fine.

The security issue creeps me in literally. :(

+1


source







All Articles