I'm android junior.
I'm trying to parse JSON URL into fragment and display it in Listview. I'm stuck for hours with various tutorials and each one is following different way.
So, please this is what I have reached, let me know what should I do further to get it working! Appreciate your help - a lot of code is copy/paste from different tutorials, plus the JSON file is just applied in different tutorial, basic one I'm just trying to get it displayed.
activity_main.xml
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.sampleapp.MainActivity" />
fragment_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.sampleapp.MainActivity$PlaceholderFragment" >
<TextView
android:id="@+id/section_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/section_label"
android:layout_centerHorizontal="true"
android:layout_marginTop="171dp"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>
itune_frag.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView android:id="@+id/vehicleType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="vehicleType" />
<TextView android:id="@+id/vehicleColor"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="vehicleColor" />
</LinearLayout>
fav_frag.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/section_label"
android:layout_centerHorizontal="true"
android:layout_marginTop="171dp"
android:text="Favvvvvv"
android:textAppearance="?android:attr/textAppearanceLarge" />
</RelativeLayout>
MainActivity.java
package com.example.sampleapp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Context;
import android.support.v13.app.FragmentPagerAdapter;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends Activity implements ActionBar.TabListener {
SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
mSectionsPagerAdapter = new SectionsPagerAdapter(getFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager
.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
actionBar.addTab(actionBar.newTab().setText("iTunes List").setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("Favourite").setTabListener(this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onTabSelected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
mViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
}
@Override
public void onTabReselected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
}
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
*/
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new Fragment();
switch (position) {
case 0:
return fragment = new iTuneFragment();
case 1:
return fragment = new favFragment();
default:
break;
}
return fragment;
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
return null;
}
}
}
iTuneFragment.java
class iTuneFragment extends Fragment {
JSONArray user = null;
ArrayList<HashMap<String, String>> jsonlist = new ArrayList<HashMap<String, String>>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
iTuneList ll = new iTuneList();
return inflater.inflate(R.layout.itune_frag, container, false);
}
}
iTuneList.java
public final class iTuneList extends ListFragment {
// URL to get JSON Array
private static String url = "http://docs.blackberry.com/sampledata.json";
// JSON Node Names
private static final String VTYPE = "vehicleType";
private static final String VCOLOR = "vehicleColor";
JSONArray user = null;
ArrayList<HashMap<String, String>> jsonlist = new ArrayList<HashMap<String, String>>();
public iTuneList() {
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
new asy().execute();
}
private class asy extends
AsyncTask<Void, Void, ArrayList<HashMap<String, String>>> {
@Override
protected ArrayList<HashMap<String, String>> doInBackground(
Void... params) {
// Creating new JSON Parser
JSONParser jParser = new JSONParser();
// Getting JSON from URL
JSONArray json = jParser.getJSONFromUrl(url);
for (int i = 0; i < json.length(); i++) {
try {
JSONObject c = json.getJSONObject(i);
String vtype = c.getString(VTYPE);
String vcolor = c.getString(VCOLOR);
Log.e("iTuneList.java", "JSON: " + vtype);
HashMap<String, String> map = new HashMap<String, String>();
// Add child node to HashMap key & value
map.put(VTYPE, vtype);
map.put(VCOLOR, vcolor);
jsonlist.add(map);
} catch (JSONException e) {
e.printStackTrace();
}
}
return jsonlist;
}
@Override
protected void onPostExecute(
ArrayList<HashMap<String, String>> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
ListAdapter adapter = new SimpleAdapter(getActivity(), result,
R.layout.itune_frag, new String[] { VTYPE, VCOLOR, },
new int[] { R.id.vehicleType, R.id.vehicleColor });
setListAdapter(adapter);
}
}
}
Additionally, I have JSONParser.java which uses getJSONFromUrl - seems fine wrapper class. And also, favFragment.java which is different story, don't mind it for now, it works fine.
THAAAAAAAAAANKS!!
public static class iTuneList extends ListFragment {
// URL to get JSON Array
private static String url = "http://docs.blackberry.com/sampledata.json";
// JSON Node Names
private static final String VTYPE = "vehicleType";
private static final String VCOLOR = "vehicleColor";
JSONArray user = null;
ArrayList<HashMap<String, String>> jsonlist = new ArrayList<HashMap<String, String>>();
public iTuneList() {
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
new asy().execute();
}
private class asy extends
AsyncTask<Void, Void, ArrayList<HashMap<String, String>>> {
@Override
protected ArrayList<HashMap<String, String>> doInBackground(
Void... params) {
// Creating new JSON Parser
JSONParser jParser = new JSONParser();
// Getting JSON from URL
JSONArray json = jParser.getJSONFromUrl(url);
for (int i = 0; i < json.length(); i++) {
try {
JSONObject c = json.getJSONObject(i);
String vtype = c.getString(VTYPE);
String vcolor = c.getString(VCOLOR);
HashMap<String, String> map = new HashMap<String, String>();
// Add child node to HashMap key & value
map.put(VTYPE, vtype);
map.put(VCOLOR, vcolor);
jsonlist.add(map);
} catch (JSONException e) {
e.printStackTrace();
}
}
return jsonlist;
}
@Override
protected void onPostExecute(
ArrayList<HashMap<String, String>> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
ListAdapter adapter = new SimpleAdapter(getActivity(), result,
R.layout.itune_frag, new String[] { VTYPE, VCOLOR, },
new int[] { R.id.vehicleType, R.id.vehicleColor });
setListAdapter(adapter);
}
}
}
Use this as your fragment.
I would suggest you to take in controll of what is happening in Adapter. Try to extend Adapter class and then specify how to assign data to Views. Basically create adapter that takes , in your case ArrayList of Hash maps as source idealy pass reference through constructor and keep it as private field. Then in GetView(int position ...other args)
get values for proper position and create view that you then return from this method.
Check this links for more details
Link1
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.