从sqlite加载数据并在ViewPager上显示

时间:2015-01-04 07:57:45

标签: android sqlite android-fragments android-viewpager

尝试从sqlite加载数据并在viewpager上显示它并没有太大成功。

我有一个带有两个选项卡的viewpager,它们应该根据作为newInstance参数传递的tag_id来保存数据。还有一个操作栏导航微调器,其中包含用于根据county_id显示的过滤器数据的县列表。

能够从服务器获取数据并将其保存在sqlite数据库中,但显示它是个问题。数据不会在viewpager的第一页上显示,但它存在于sqlite中。第二个数据是唯一一个加盖的数据。

以下是我的实施;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBar.OnNavigationListener;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.NetworkError;
import com.android.volley.NoConnectionError;
import com.android.volley.ParseError;
import com.android.volley.Response;
import com.android.volley.ServerError;
import com.android.volley.TimeoutError;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.app.adapter.CustomCountySpinnerAdapter;
import com.app.adapter.TendersAdapter;
import com.app.database.DBFunctions;
import com.app.externallib.AppController;
import com.app.model.CountyModel;
import com.app.model.PostsModel;
import com.app.utils.AppConstants;
import com.app.utils.PostsListLoader;
import com.nhaarman.listviewanimations.appearance.simple.SwingBottomInAnimationAdapter;
import com.viewpagerindicator.TabPageIndicator;

public class PublicTendersFragment extends Fragment{

    private static List<PubliTenders> public_tenders;

    public PublicTendersFragment newInstance(String text) {
        PublicTendersFragment mFragment = new PublicTendersFragment();
        Bundle mBundle = new Bundle();
        mBundle.putString(AppConstants.TEXT_FRAGMENT, text);
        mFragment.setArguments(mBundle);
        return mFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        public_tenders = new ArrayList<PubliTenders>();
        public_tenders.add(new PubliTenders(14, "County"));
        public_tenders.add(new PubliTenders(15, "National"));

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        final Context contextThemeWrapper = new ContextThemeWrapper(
                getActivity(), R.style.StyledIndicators);

        LayoutInflater localInflater = inflater
                .cloneInContext(contextThemeWrapper);

        View v = localInflater.inflate(R.layout.fragment_tenders, container,
                false);

        FragmentPagerAdapter adapter = new TendersVPAdapter(
                getFragmentManager());
        ViewPager pager = (ViewPager) v.findViewById(R.id.pager);
        pager.setAdapter(adapter);

        TabPageIndicator indicator = (TabPageIndicator) v
                .findViewById(R.id.indicator);

        indicator.setViewPager(pager);

        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setHasOptionsMenu(true);
    }

    class TendersVPAdapter extends FragmentPagerAdapter{

        public TendersVPAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Parcelable saveState() {
            return null;
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                return Tenders.newInstance(public_tenders.get(position).tag_id);

            case 1:
                return Tenders.newInstance(public_tenders.get(position).tag_id);

            default:
                return null;

            }

        }

        @Override
        public CharSequence getPageTitle(int position) {
            return public_tenders.get(position).tender_type.toUpperCase(Locale
                    .getDefault());
        }

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

    public class PubliTenders {
        public int tag_id;
        public String tender_type;

        public PubliTenders(int tag_id, String tender_type) {
            this.tag_id = tag_id;
            this.tender_type = tender_type;
        }
    }

    public static class Tenders extends ListFragment implements
            OnNavigationListener, LoaderCallbacks<ArrayList<PostsModel>> {

        boolean mDualPane;
        int mCurCheckPosition = 0;

        // private static View rootView;
        private SwipeRefreshLayout swipeContainer;
        private ListView lv;
        private View rootView;

        private DBFunctions mapper;
        private CustomCountySpinnerAdapter spinadapter;
        private TendersAdapter mTendersAdapter;

        private static final String ARG_TAG_ID = "tag_id";
        private int tag_id;
        private int mycounty;
        private static final int INITIAL_DELAY_MILLIS = 500;

        private static final String DEBUG_TAG = "BlogsFragment";
        private final String TAG_REQUEST = "BLOG_TAG";
        private JsonArrayRequest jsonArrTendersRequest;

        // private OnItemSelectedListener listener;

        public static Tenders newInstance(int tag_id) {
            Tenders fragment = new Tenders();
            Bundle b = new Bundle();
            b.putInt(ARG_TAG_ID, tag_id);
            fragment.setArguments(b);
            return fragment;
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            tag_id = getArguments().getInt(ARG_TAG_ID);
        }

        @Override
        public void onStart() {
            super.onStart();

            getLoaderManager().initLoader(0, null, this);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

            rootView = inflater.inflate(R.layout.fragment_headlines_blog,
                    container, false);
            swipeContainer = (SwipeRefreshLayout) rootView
                    .findViewById(R.id.swipeProjectsContainer);
            lv = (ListView) rootView.findViewById(android.R.id.list);
            lv.setOnScrollListener(new AbsListView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(AbsListView view,
                        int scrollState) {

                }

                @Override
                public void onScroll(AbsListView view, int firstVisibleItem,
                        int visibleItemCount, int totalItemCount) {
                    int topRowVerticalPosition = (lv == null || lv
                            .getChildCount() == 0) ? 0 : lv.getChildAt(0)
                            .getTop();
                    swipeContainer.setEnabled(topRowVerticalPosition >= 0);
                }
            });

            swipeContainer.setOnRefreshListener(new OnRefreshListener() {

                @Override
                public void onRefresh() {
                    fetchPublicTenders(mycounty);
                }
            });
            swipeContainer.setColorSchemeResources(R.color.blue_dark,
                    R.color.irdac_green, R.color.red_light,
                    R.color.holo_red_light);

            return rootView;
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            setHasOptionsMenu(true);

            mapper = new DBFunctions(getActivity());
            mapper.open();

            // initialize AB Spinner
            populateSpinner();

            fetchPublicTenders(mycounty);

        }

        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);

        }

        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);

            outState.putInt("curChoice", mCurCheckPosition);
        }

        private void populateSpinner() {
            try {

                List<CountyModel> counties = new ArrayList<CountyModel>();

                counties = mapper.getAllCounties();

                ActionBar actBar = ((ActionBarActivity) getActivity())
                        .getSupportActionBar();
                actBar.setDisplayShowTitleEnabled(true);
                actBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);

                spinadapter = new CustomCountySpinnerAdapter(getActivity(),
                        android.R.layout.simple_spinner_dropdown_item, counties);

                actBar.setListNavigationCallbacks(spinadapter, this);

            } catch (NullPointerException exp) {

            }

        }

        @Override
        public Loader<ArrayList<PostsModel>> onCreateLoader(int arg0,
                Bundle arg1) {
            Log.v(DEBUG_TAG, "On Create Loader");

            return new PostsListLoader(getActivity(), mycounty, tag_id);
        }

        @Override
        public void onLoadFinished(Loader<ArrayList<PostsModel>> arg0,
                ArrayList<PostsModel> data) {
            // System.out.println("results " + data.size());
            addToAdapter(data);
        }

        @Override
        public void onLoaderReset(Loader<ArrayList<PostsModel>> arg0) {
            lv.setAdapter(null);

        }

        @Override
        public boolean onNavigationItemSelected(int pos, long arg1) {
            CountyModel mo = spinadapter.getItem(pos);
            this.mycounty = mo.getId();
            refresh(mo.getId());
            return false;
        }

        @Override
        public void onListItemClick(ListView l, View v, int position, long id) {
            TextView txtTitle = (TextView) v.findViewById(R.id.tender_title);
            TextView txtRefNo = (TextView) v.findViewById(R.id.ref_no);
            TextView txtExpiryDate = (TextView) v
                    .findViewById(R.id.expiry_date);
            TextView txtOrg = (TextView) v.findViewById(R.id.dept_or_org);

            Intent intTenderFullDetails = new Intent(getActivity(),
                    TenderDetailsActivity.class);
            intTenderFullDetails.putExtra(TenderDetailsActivity.TENDER_TITLE,
                    txtTitle.getText().toString().trim());
            intTenderFullDetails.putExtra(TenderDetailsActivity.TENDER_REF_NO,
                    txtRefNo.getText().toString().trim());
            intTenderFullDetails.putExtra(
                    TenderDetailsActivity.TENDER_EXPIRY_DATE, txtExpiryDate
                            .getText().toString().trim());
            intTenderFullDetails.putExtra(TenderDetailsActivity.TENDER_ORG,
                    txtOrg.getText().toString().trim());
            // intTenderFullDetails.putExtra(TenderDetailsActivity.TENDER_DESC,
            // Lorem);
            startActivity(intTenderFullDetails);

        }

        private void fetchPublicTenders(final int county_id) {
            swipeContainer.setRefreshing(true);

            Uri.Builder builder = Uri.parse(AppConstants.postsUrl).buildUpon();
            builder.appendQueryParameter("tag_id", Integer.toString(tag_id));

            System.out.println("fetchPublicTenders with tag_id " + tag_id
                    + " and county_id " + county_id);

            jsonArrTendersRequest = new JsonArrayRequest(builder.toString(),
                    new Response.Listener<JSONArray>() {
                        @Override
                        public void onResponse(JSONArray response) {
                            if (response.length() > 0) {
                                for (int i = 0; i < response.length(); i++) {

                                    try {
                                        JSONObject tender_item = response
                                                .getJSONObject(i);
                                        mapper.createPost(
                                                tender_item.getInt("id"),
                                                tender_item.getInt("tag_id"),
                                                tender_item.getInt("county_id"),
                                                tender_item.getInt("sector_id"),
                                                tender_item.getString("title"),
                                                tender_item.getString("slug"),
                                                tender_item.getString("content"),
                                                tender_item
                                                        .getString("reference_no"),
                                                tender_item
                                                        .getString("expiry_date"),
                                                tender_item
                                                        .getString("organization"),
                                                tender_item
                                                        .getString("image_url"),
                                                tender_item
                                                        .getString("created_at"));
                                    } catch (JSONException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }

                                    swipeContainer.setRefreshing(false);
                                    refresh(county_id);
                                }
                            } else {

                                if (swipeContainer.isShown()) {
                                    swipeContainer.setRefreshing(false);
                                }
                                try {
                                    Toast.makeText(getActivity(),
                                            "Sorry! No results found",
                                            Toast.LENGTH_LONG).show();
                                } catch (NullPointerException npe) {
                                    System.out.println(npe);
                                }

                            }

                        }
                    }, new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            if (error instanceof NetworkError) {
                                try {
                                    Toast.makeText(
                                            getActivity(),
                                            "Network Error. Cannot refresh list",
                                            Toast.LENGTH_SHORT).show();
                                } catch (NullPointerException npe) {
                                    System.err.println(npe);
                                }
                                if (swipeContainer.isShown()) {
                                    swipeContainer.setRefreshing(false);
                                }
                                refresh(county_id);
                            } else if (error instanceof ServerError) {

                                try {
                                    Toast.makeText(
                                            getActivity(),
                                            "Problem Connecting to Server. Try Again Later",
                                            Toast.LENGTH_SHORT).show();
                                } catch (NullPointerException npe) {
                                    System.err.println(npe);
                                }
                                if (swipeContainer.isShown()) {
                                    swipeContainer.setRefreshing(false);
                                }
                            } else if (error instanceof AuthFailureError) {
                            } else if (error instanceof ParseError) {
                            } else if (error instanceof NoConnectionError) {
                                try {
                                    Toast.makeText(getActivity(),
                                            "No Connection", Toast.LENGTH_SHORT)
                                            .show();
                                } catch (NullPointerException npe) {
                                    System.err.println(npe);
                                }
                            } else if (error instanceof TimeoutError) {
                                try {
                                    Toast.makeText(
                                            getActivity()
                                                    .getApplicationContext(),
                                            "Timeout Error. Try Again Later",
                                            Toast.LENGTH_SHORT).show();
                                } catch (NullPointerException npe) {
                                    System.err.println(npe);
                                }
                            }
                            if (swipeContainer.isShown()) {
                                swipeContainer.setRefreshing(false);
                            }
                        }
                    }) {
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    HashMap<String, String> headers = new HashMap<String, String>();
                    headers.put("Accept", "application/json");
                    return headers;
                }
            };

            // Set a retry policy in case of SocketTimeout & ConnectionTimeout
            // Exceptions. Volley does retry for you if you have specified the
            // policy.
            jsonArrTendersRequest.setRetryPolicy(new DefaultRetryPolicy(
                    (int) TimeUnit.SECONDS.toMillis(20),
                    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
            jsonArrTendersRequest.setTag(TAG_REQUEST);
            AppController.getInstance().addToRequestQueue(jsonArrTendersRequest);
        }

        public void refresh(int county_id) {
            Bundle b = new Bundle();
            b.putInt("myconty", county_id);
            if (isAdded()) {
                getLoaderManager().restartLoader(0, b, this);
            }

        }

        private void addToAdapter(ArrayList<PostsModel> plist) {
            mTendersAdapter = new TendersAdapter(rootView.getContext(), plist);
            SwingBottomInAnimationAdapter swingBottomInAnimationAdapter = new SwingBottomInAnimationAdapter(
                    mTendersAdapter);
            swingBottomInAnimationAdapter.setAbsListView(lv);
            assert swingBottomInAnimationAdapter.getViewAnimator() != null;
            swingBottomInAnimationAdapter.getViewAnimator()
                    .setInitialDelayMillis(INITIAL_DELAY_MILLIS);
            setListAdapter(swingBottomInAnimationAdapter);
            mTendersAdapter.notifyDataSetChanged();
        }

    }


}

这是PostsListLoader类

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;

import com.app.database.DBFunctions;
import com.app.model.PostsModel;

public class PostsListLoader extends AsyncTaskLoader<ArrayList<PostsModel>> {
    private DBFunctions mapper;
    private ArrayList<PostsModel> myPostsModel;
    private int county_id;
    private int tag_id;

    public PostsListLoader(Context context, int county_id, int tag_id) {
        super(context);
        mapper = new DBFunctions(getContext());
        mapper.open();

        this.county_id = county_id;
        this.tag_id = tag_id;

    }

    @Override
    public ArrayList<PostsModel> loadInBackground() {
        String query_string = AppConstants.KEY_COUNTY_ID + " = " + county_id
                + " AND " + AppConstants.KEY_TAG_ID + " = " + tag_id;
        myPostsModel = mapper.getPosts(query_string);
        return myPostsModel;
    }

    @Override
    public void deliverResult(ArrayList<PostsModel> data) {
        if (isReset()) {
            // An async query came in while the loader is stopped. We
            // don't need the result.
            if (data != null) {
                onReleaseResources(data);
            }
        }
        List<PostsModel> oldNews = data;

        myPostsModel = data;

        if (isStarted()) {
            // If the Loader is currently started, we can immediately
            // deliver its results.
            super.deliverResult(data);
        }

        // At this point we can release the resources associated with
        // 'oldNews' if needed; now that the new result is delivered we
        // know that it is no longer in use.
        if (oldNews != null) {
            onReleaseResources(oldNews);
        }

    }

    /**
     * Handles a request to start the Loader.
     */
    @Override
    protected void onStartLoading() {
        if (myPostsModel != null) {
            // If we currently have a result available, deliver it
            // immediately.
            deliverResult(myPostsModel);
        }

        if (takeContentChanged() || myPostsModel == null) {
            // If the data has changed since the last time it was loaded
            // or is not currently available, start a load.
            forceLoad();
        }
    }

    /**
     * Handles a request to stop the Loader.
     */
    @Override
    protected void onStopLoading() {
        // Attempt to cancel the current load task if possible.
        cancelLoad();
    }

    /**
     * Handles a request to cancel a load.
     */
    @Override
    public void onCanceled(ArrayList<PostsModel> news) {
        super.onCanceled(news);

        // At this point we can release the resources associated with 'news'
        // if needed.
        onReleaseResources(news);
    }

    /**
     * Handles a request to completely reset the Loader.
     */
    @Override
    protected void onReset() {
        super.onReset();

        // Ensure the loader is stopped
        onStopLoading();

        // At this point we can release the resources associated with 'apps'
        // if needed.
        if (myPostsModel != null) {
            onReleaseResources(myPostsModel);
            myPostsModel = null;
        }
    }

    /**
     * Helper function to take care of releasing resources associated with an
     * actively loaded data set.
     */
    protected void onReleaseResources(List<PostsModel> news) {
    }

}

我可能做错了什么?

任何帮助将不胜感激。

由于

0 个答案:

没有答案