I am trying to merge two project that I have. The first is an swipe down to refresh and the second include Tabs and Navigation Drawer. But I have a problem that is the Adapter of the swipe to refresh is need Activity and the Tabs project inflate a View. I tried to Check on Google but the Application Doesn't Run. To convert the View to the Activity but it also doesn't work. Another problem that may appear that I am using a progress dialog and it's need the Application Context which I don't know how to retrieve it from the View.
If Anyone Can help me please this is my code:
this is the Fragment in the Tab that I want the swipe to refresh to run inside it:
package Fragments;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.Toast;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.subhi.tabhost.Adapter;
import com.subhi.tabhost.AppController;
import com.subhi.tabhost.Item;
import com.subhi.tabhost.R;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
/**
* Created by subhi on 2/9/2016.
*/
public class NewsFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener{
private static final String url = "http://192.168.1.106/listview/xx.php";
private ProgressDialog dialog;
private List<Item> array = new ArrayList<Item>();
private ListView listView;
private Adapter adapter;
public SwipeRefreshLayout mSwipeRefreshLayout;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View v=inflater.inflate(R.layout.news_fragment_layout,container,false);
mSwipeRefreshLayout = (SwipeRefreshLayout)v.findViewById(R.id.swipe_refresh_layout);
listView = (ListView)v.findViewById(R.id.list_item);
Activity host= (Activity) v.getContext();
v.isFocused();
adapter=new Adapter(host,array);
listView.setAdapter(adapter);
// mSwipeRefreshLayout.setRefreshing(false);
dialog=new ProgressDialog(getContext());
dialog.setMessage("Loading...");
dialog.show();
mSwipeRefreshLayout.setOnRefreshListener(this);
mSwipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(true);
refreshcontent(v.getContext());
}
}
);
return v;
}
public void refreshcontent(final Context v)
{
mSwipeRefreshLayout.setRefreshing(true);
JsonArrayRequest jsonArrayRequest=new JsonArrayRequest(url, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
hideDialog();
//parsing json
if(response.length()>0) {
for (int i = 0; i < response.length(); i++) {
try {
JSONObject obj = response.getJSONObject(i);
Item item = new Item();
item.setTitle(obj.getString("title"));
item.setImage(obj.getString("image"));
item.setRate(obj.getDouble("rating"));
item.setYear(obj.getInt("releaseYear"));
/*//genre is json array
/JSONArray genreArray=obj.getJSONArray("genre");
ArrayList<String> genre=new ArrayList<String>();
for(int j=0;j<genreArray.length();j++){
genre.add((String) genreArray.get(j));
}
item.setGenre(genre);*/
//add to array
array.add(0,item);
} catch (JSONException ex) {
ex.printStackTrace();
}
}
adapter.notifyDataSetChanged();
}
mSwipeRefreshLayout.setRefreshing(false);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//Log.e(TAG, "Server Error: " + error.getMessage());
Toast.makeText(v.getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
// stopping swipe refresh
mSwipeRefreshLayout.setRefreshing(false);
}
}
);
//mSwipeRefreshLayout.setRefreshing(false);
AppController.getmInstance().addToRequesQueue(jsonArrayRequest);
}
public void hideDialog(){
if(dialog !=null){
dialog.dismiss();
dialog=null;
}
}
@Override
public void onRefresh() {
refreshcontent();
}
}
And this is Adapter for The Swipe to Refresh :
package com.subhi.tabhost;
import android.app.Activity;
import android.content.Context;
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 java.util.List;
/**
* Created by tb_laota on 9/21/2015.
*/
public class Adapter extends BaseAdapter{
private LayoutInflater inflater;
private Activity activity;
private List<Item> items;
ImageLoader imageLoader=AppController.getmInstance().getmImageLoader();
public Adapter(Activity activity,List<Item> items){
this.activity=activity;
this.items=items;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@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.custom_layout,null);
}
if(imageLoader==null)
imageLoader=AppController.getmInstance().getmImageLoader();
NetworkImageView imageView= (NetworkImageView) convertView.findViewById(R.id.image_view);
TextView title= (TextView) convertView.findViewById(R.id.tv_title);
TextView rate= (TextView) convertView.findViewById(R.id.tv_rate);
TextView genre= (TextView) convertView.findViewById(R.id.tv_genre);
TextView year= (TextView) convertView.findViewById(R.id.tv_year);
//getting data for row
Item item=items.get(position);
imageView.setImageUrl(item.getImage(), imageLoader);
//title
title.setText(item.getTitle());
//rate
rate.setText(String.valueOf(item.getRate()));
//String genreStr="";
//year
year.setText(String.valueOf(item.getYear()));
return convertView;
}
}
Also This is the Log Cat:
02-16 06:14:48.165 1950-1950/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.subhi.tabhost, PID: 1950
java.lang.NullPointerException
at com.subhi.tabhost.Adapter.<init>(Adapter.java:23)
at Fragments.NewsFragment.onCreateView(NewsFragment.java:58)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1962)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)
at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
at android.support.v4.view.ViewPager.populate(ViewPager.java:1106)
at android.support.v4.view.ViewPager.populate(ViewPager.java:952)
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1474)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:16497)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455)
at android.view.View.measure(View.java:16497)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455)
at android.view.View.measure(View.java:16497)
at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:940)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:391)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
at android.view.View.measure(View.java:16497)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at and
02-16 06:14:48.169 1950-1953/? D/dalvikvm: GC_CONCURRENT freed 243K, 8% free 4713K/5080K, paused 2ms+0ms, total 5ms
02-16 06:14:48.293 518-803/? W/ActivityManager: Force finishing activity com.subhi.tabhost/.MainActivity
02-16 06:14:48.633 518-803/? D/dalvikvm: GC_FOR_ALLOC freed 895K, 26% free 8529K/11444K, paused 6ms, total 6ms
02-16 06:14:48.641 518-533/? D/dalvikvm: GC_FOR_ALLOC freed 32K, 22% free 9000K/11444K, paused 9ms, total 9ms
02-16 06:14:48.645 518-533/? I/dalvikvm-heap: Grow heap (frag case) to 9.986MB for 1127532-byte allocation
02-16 06:14:48.657 518-532/? D/dalvikvm: GC_FOR_ALLOC freed <1K, 20% free 10100K/12548K, paused 9ms, total 9ms
and if there is any needed Data I will Edit my question.
Thanks Everyone, The Error Was that i am using an class extends Application and i didn't put name of the Class in manifest file..