[英]Populating JSON listview in a fragment
I am a beginner in java/android programming but I was trying to add different tutorials to create a customized application that does what I want, this could be something easy to most of the people here but am stuck in this one am trying to use this Navigation Drawer View Pager trying to populate the tab one fragment with this Custom ListView with Volley . 我是Java / android编程的初学者,但是我试图添加不同的教程来创建可以满足我需要的自定义应用程序,这对大多数人来说可能很容易,但是我被困在尝试使用此功能的过程中导航抽屉视图分页器试图使用Volley将此Custom ListView填充到选项卡一个片段。
I want to transfer the code in the MainActivity.java of custom listview to a tab fragment in navigation drawer but I get errors. 我想将自定义listview的MainActivity.java中的代码传输到导航抽屉中的选项卡片段,但出现错误。
Fragment Tab 片段标签
public class TabTwoFragment extends Fragment{
private TextView txtFragmenttwo;
public static TabTwoFragment newInstance() {
Bundle bundle = new Bundle();
TabTwoFragment fragment = new TabTwoFragment();
fragment.setArguments(bundle);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.two_fragment, container, false);
txtFragmenttwo = (TextView) rootView.findViewById(R.id.txtFragmentTwo);
txtFragmenttwo.setText(R.string.fragment_tab_two);
rootView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT ));
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
}`
MainActivity 主要活动
public class MainActivity extends Activity {
// Log tag
private static final String TAG = MainActivity.class.getSimpleName();
// Movies json url
private static final String url = "http://api.androidhive.info/json/movies.json";
private ProgressDialog pDialog;
private List<Movie> movieList = new ArrayList<Movie>();
private ListView listView;
private CustomListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.list);
adapter = new CustomListAdapter(this, movieList);
listView.setAdapter(adapter);
pDialog = new ProgressDialog(this);
// Showing progress dialog before making http request
pDialog.setMessage("Loading...");
pDialog.show();
// changing action bar color
getActionBar().setBackgroundDrawable(
new ColorDrawable(Color.parseColor("#1b1b1b")));
// Creating volley request obj
JsonArrayRequest movieReq = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Log.d(TAG, response.toString());
hidePDialog();
// Parsing json
for (int i = 0; i < response.length(); i++) {
try {
JSONObject obj = response.getJSONObject(i);
Movie movie = new Movie();
movie.setTitle(obj.getString("title"));
movie.setThumbnailUrl(obj.getString("image"));
movie.setRating(((Number) obj.get("rating"))
.doubleValue());
movie.setYear(obj.getInt("releaseYear"));
// Genre is json array
JSONArray genreArry = obj.getJSONArray("genre");
ArrayList<String> genre = new ArrayList<String>();
for (int j = 0; j < genreArry.length(); j++) {
genre.add((String) genreArry.get(j));
}
movie.setGenre(genre);
// adding movie to movies array
movieList.add(movie);
} catch (JSONException e) {
e.printStackTrace();
}
}
// notifying list adapter about data changes
// so that it renders the list view with updated data
adapter.notifyDataSetChanged();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
hidePDialog();
}
});
// Adding request to request queue
AppController.getInstance().addToRequestQueue(movieReq);
}
Both Code 两种代码
public class TabOneFragment extends Fragment{
private static final String TAG = TabOneFragment.class.getSimpleName();
// Movies json url
private static final String url = "http://api.androidhive.info/json/movies.json";
private ProgressDialog pDialog;
private List<Movie> movieList = new ArrayList<Movie>();
private ListView listView;
private CustomListAdapter adapter;
//private TextView txtFragmentone;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}
public static TabOneFragment newInstance() {
TabOneFragment fragment = new TabOneFragment();
return fragment;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.one_fragment, container, false);
//txtFragmentone = (TextView) rootView.findViewById(R.id.txtFragmentOne);
//txtFragmentone.setText(R.string.fragment_tab_one);
rootView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT ));
listView = (ListView) getActivity().findViewById(R.id.list);
adapter = new CustomListAdapter(this, movieList);
listView.setAdapter(adapter);
pDialog = new ProgressDialog(this);
// Showing progress dialog before making http request
pDialog.setMessage("Loading...");
pDialog.show();
// changing action bar color
getActivity().getActionBar().setBackgroundDrawable(
new ColorDrawable(Color.parseColor("#1b1b1b")));
// Creating volley request obj
JsonArrayRequest movieReq = new JsonArrayRequest(url,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Log.d(TAG, response.toString());
hidePDialog();
// Parsing json
for (int i = 0; i < response.length(); i++) {
try {
JSONObject obj = response.getJSONObject(i);
Movie movie = new Movie();
movie.setTitle(obj.getString("title"));
movie.setThumbnailUrl(obj.getString("image"));
movie.setRating(((Number) obj.get("rating"))
.doubleValue());
movie.setYear(obj.getInt("releaseYear"));
// Genre is json array
JSONArray genreArry = obj.getJSONArray("genre");
ArrayList<String> genre = new ArrayList<String>();
for (int j = 0; j < genreArry.length(); j++) {
genre.add((String) genreArry.get(j));
}
movie.setGenre(genre);
// adding movie to movies array
movieList.add(movie);
} catch (JSONException e) {
e.printStackTrace();
}
}
// notifying list adapter about data changes
// so that it renders the list view with updated data
adapter.notifyDataSetChanged();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
hidePDialog();
}
});
// Adding request to request queue
AppController.getInstance().addToRequestQueue(movieReq);
return rootView;
}
I get error at 我在错误
adapter = new CustomListAdapter(this, movieList);
and 和
pDialog = new ProgressDialog(this);
constructor is undefined 构造函数未定义
Yet they both compile well in their examples. 然而,它们在示例中的汇编都很好。
This is the logcat am getting after running the code: 这是运行代码后的logcat:
03-27 22:30:57.085: E/AndroidRuntime(10963): FATAL EXCEPTION: main
03-27 22:30:57.085: E/AndroidRuntime(10963): java.lang.NullPointerException
03-27 22:30:57.085: E/AndroidRuntime(10963): at info.androidhive.customlistviewvolley.adater.CustomListAdapter.<init>(CustomListAdapter.java:24)
03-27 22:30:57.085: E/AndroidRuntime(10963): at br.liveo.fragments.TabOneFragment.onCreateView(TabOneFragment.java:75)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:478)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.view.View.measure(View.java:12773)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.widget.LinearLayout.measureVertical(LinearLayout.java:815)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.view.View.measure(View.java:12773)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4788)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.view.View.measure(View.java:12773)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4788)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.view.View.measure(View.java:12773)
03-27 22:30:57.085: E/AndroidRuntime(10963): at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:704)
EDIT 2 编辑2
CustomAdapterList CustomAdapterList
public class CustomListAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<Movie> movieItems;
ImageLoader imageLoader = AppController.getInstance().getImageLoader();
public CustomListAdapter(Activity activity, List<Movie> movieItems) {
this.activity = activity;
this.movieItems = movieItems;
}
@Override
public int getCount() {
return movieItems.size();
}
@Override
public Object getItem(int location) {
return movieItems.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.list_row, null);
if (imageLoader == null)
imageLoader = AppController.getInstance().getImageLoader();
NetworkImageView thumbNail = (NetworkImageView) convertView
.findViewById(R.id.thumbnail);
TextView title = (TextView) convertView.findViewById(R.id.title);
TextView rating = (TextView) convertView.findViewById(R.id.rating);
TextView genre = (TextView) convertView.findViewById(R.id.genre);
TextView year = (TextView) convertView.findViewById(R.id.releaseYear);
// getting movie data for the row
Movie m = movieItems.get(position);
// thumbnail image
thumbNail.setImageUrl(m.getThumbnailUrl(), imageLoader);
// title
title.setText(m.getTitle());
// rating
rating.setText("Rating: " + String.valueOf(m.getRating()));
// genre
String genreStr = "";
for (String str : m.getGenre()) {
genreStr += str + ", ";
}
genreStr = genreStr.length() > 0 ? genreStr.substring(0,
genreStr.length() - 2) : genreStr;
genre.setText(genreStr);
// release year
year.setText(String.valueOf(m.getYear()));
return convertView;
}
Make this change in your Manifest
file: 在Manifest
文件中进行以下更改:
<application
android:name=".AppController" //this one (your path to AppController file)
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
In your TabOneFragment
file in function onCreateView
, change this line 在函数onCreateView
TabOneFragment
文件中,更改此行
listView = (ListView) getActivity().findViewById(R.id.list);
to 至
listView = (ListView) rootView.findViewById(R.id.list);
this will resolve your problem. 这将解决您的问题。
On your class TabOneFragment
Change to this: 在您的类TabOneFragment
更改为:
adapter = new CustomListAdapter(getActivity(), movieList);
and 和
pDialog = new ProgressDialog(getActivity());
CustomAdapterList CustomAdapterList
public class CustomListAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<Movie> movieItems = new ArrayList<>();
ImageLoader imageLoader = AppController.getInstance().getImageLoader();
public CustomListAdapter(Activity activity, List<Movie> movieItems) {
this.activity = activity;
this.movieItems = movieItems;
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return movieItems != null ? movieItems.size() : 0;
}
@Override
public Object getItem(int location) {
return movieItems != null ? movieItems.get(location) : null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
convertView = inflater.inflate(R.layout.list_row, parent, false);
NetworkImageView thumbNail = (NetworkImageView) convertView.findViewById(R.id.thumbnail);
TextView title = (TextView) convertView.findViewById(R.id.title);
TextView rating = (TextView) convertView.findViewById(R.id.rating);
TextView genre = (TextView) convertView.findViewById(R.id.genre);
TextView year = (TextView) convertView.findViewById(R.id.releaseYear);
// getting movie data for the row
Movie m = movieItems.get(position);
// thumbnail image
thumbNail.setImageUrl(m.getThumbnailUrl(), imageLoader);
// title
title.setText(m.getTitle());
// rating
rating.setText("Rating: " + String.valueOf(m.getRating()));
// genre
String genreStr = "";
for (String str : m.getGenre()) {
genreStr += str + ", ";
}
genreStr = genreStr.length() > 0 ? genreStr.substring(0,genreStr.length() - 2) : genreStr;
genre.setText(genreStr);
// release year
year.setText(String.valueOf(m.getYear()));
return convertView;
}
}
In TabOneFragment Class change 在TabOneFragment类中更改
adapter = new CustomListAdapter(this, movieList);
to 至
adapter = new CustomListAdapter(getActivity(), movieList);
and 和
pDialog = new ProgressDialog(this);
to 至
pDialog = new ProgressDialog(getActivity());
Both constructors accept a Context not a Fragment, so basicly in your fragment class you cannot call this but you'll have to you getActivity() 两个构造函数都接受一个Context而不是一个Fragment,因此基本上在您的fragment类中您不能调用此方法,但必须使用getActivity()
I found out and thought this could be helpful to some other person check this question i was missing 我发现了,认为这可帮助其他人检查这个问题,我失踪
android:name=".AppController"
in my manifest 清单中的android:name=".AppController"
<application
android:name=".AppController" //this one
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.