如何从SQLite中获取数据并将其填充到片段中的RecyclerView?

时间:2018-02-09 06:38:19

标签: android sqlite android-fragments android-recyclerview

我一直在处理我的应用上需要从SQLite插入和检索数据的功能。到目前为止,该功能的插入部分正在工作(数据库和表已创建,它们具有值),但检索没有。我有一个NPE,说我在null对象引用上调用了RecyclerView。然后应用程序崩溃了。我在下面提供了我的代码。有什么帮助吗?谢谢!

fetchAllSavedNews()方法:

public ArrayList<News> fetchAllSavedNews() {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(TABLE_NAME, allColumns,
                null,null,null, null, KEY_DATE + " DESC");

        ArrayList<News> newsList = new ArrayList<>();
        if(cursor.getCount() > 0) while (cursor.moveToNext()) {
            int index0 = cursor.getColumnIndex(KEY_ID);
            int index1 = cursor.getColumnIndex(KEY_SERVER_ID);
            int index2 = cursor.getColumnIndex(KEY_TITLE);
            int index3 = cursor.getColumnIndex(KEY_IMAGE);
            int index4 = cursor.getColumnIndex(KEY_CATEGORY);
            int index5 = cursor.getColumnIndex(KEY_CONTENT);
            int index6 = cursor.getColumnIndex(KEY_AUTHOR);
            int index7 = cursor.getColumnIndex(KEY_DATE);

            int id = cursor.getInt(index0);
            int server_id = cursor.getInt(index1);
            String title = cursor.getString(index2);
            byte[] imageByteArray = cursor.getBlob(index3);
            Bitmap imageBitmap = BitmapFactory.decodeByteArray(imageByteArray, 0, imageByteArray.length);
            String category = cursor.getString(index4);
            String content = cursor.getString(index5);
            String author = cursor.getString(index6);
            String publicationDate = cursor.getString(index7);

            News savedNewsArrayList = new News(id, server_id, title, imageBitmap, category, content, author, publicationDate);
            newsList.add(savedNewsArrayList);
        }
        // return All Employees
        return newsList;
    }

片段

public class FavoriteNewsFragment extends Fragment implements ConnectivityReceiver.ConnectivityReceiverListener {

    public FavoriteNewsFragment() {
        // Required empty public constructor
    }

    final String TAG = "MainPageActivity";
    DatabaseHelper myDb;
    public RecyclerView rvSavedNews;
    public SavedNewsArticleAdapter adapter;
    public SwipeRefreshLayout swipeRefreshLayout;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view =  inflater.inflate(R.layout.fragment_favorite_news, container, false);

        myDb = new DatabaseHelper(getActivity());

        checkConnection();

        rvSavedNews = (RecyclerView) view.findViewById(R.id.rvSavedNews);
        rvSavedNews.setHasFixedSize(true);
        final LinearLayoutManager manager = new LinearLayoutManager(getActivity());
        rvSavedNews.setLayoutManager(manager);
        rvSavedNews.setItemAnimator(new DefaultItemAnimator());


        swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefresh);
        swipeRefreshLayout.setColorSchemeResources(R.color.primaryColor, R.color.primaryTextColor, R.color.secondaryColor);
        swipeRefreshLayout.setSize(SwipeRefreshLayout.LARGE);
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        loadSavedNews();
                    }
                }, 1000);
            }
        });

        return view;
    }

    private void loadSavedNews() {
        adapter = new SavedNewsArticleAdapter(getActivity(), myDb.fetchAllSavedNews());
        rvSavedNews.setAdapter(adapter);
        swipeRefreshLayout.setRefreshing(false);
    }

    // Method to manually check connection status
    private void checkConnection() {
        boolean isConnected = isConnected();
        snackInternet(isConnected);
    }

    private void snackInternet(boolean isConnected) {
        if (isConnected) {
            Snackbar snackbar = Snackbar.make(getActivity().findViewById(android.R.id.content), "Connected to the Internet!", Snackbar.LENGTH_SHORT);
            View sbView = snackbar.getView();
            sbView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.primaryDarkColor));
            snackbar.show();
            loadSavedNews();
        }
        else {
            Snackbar snackbar = Snackbar
                    .make(getActivity().findViewById(android.R.id.content), "You seem to be offline.", Snackbar.LENGTH_INDEFINITE)
                    .setAction("Retry", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            loadSavedNews();
                        }
                    });
            View sbView = snackbar.getView();
            sbView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.maroon));
            snackbar.show();
            loadSavedNews();
        }
    }

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

        // register connection status listener
        TheFlare.getInstance().setConnectivityListener(this);
    }

    /**
     * Callback will be triggered when there is change in
     * network connection
     */
    @Override
    public void onNetworkConnectionChanged(boolean isConnected) {
        snackInternet(isConnected);
    }

}

适配器

public class SavedNewsArticleAdapter extends RecyclerView.Adapter<SavedNewsArticleAdapter.SavedNewsViewHolder> {

    private Context context;
    private ArrayList<News> savedNews;

    public SavedNewsArticleAdapter(Context context, ArrayList<News> savedNews){
        this.context = context;
        this.savedNews = savedNews;
    }

    @Override
    public SavedNewsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.from(parent.getContext())
                .inflate(R.layout.news_cardview_layout, parent, false);

        SavedNewsViewHolder savedNewsViewHolder = new SavedNewsViewHolder(view);
        return savedNewsViewHolder;
    }

    @Override
    public void onBindViewHolder(SavedNewsViewHolder holder, int position) {
        final News selectedSavedNews = savedNews.get(position);
        holder.tvId.setText(String.valueOf(selectedSavedNews.getId()));
        holder.tvTitle.setText(selectedSavedNews.getTitle());
        holder.tvPubDate.setText("" + selectedSavedNews.getPublicationDate());

        Picasso.with(context)
                .load(selectedSavedNews.getImgBanner())
                .placeholder(R.drawable.bannerplaceholder)
                .error(android.R.drawable.stat_notify_error)
                .into(holder.ivImage);

        holder.ivImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick (View view) {
                Intent intent = new Intent(context, SavedNewsDetailActivity.class);
                intent.putExtra("savedNews", selectedSavedNews);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
        });
    }

    @Override
    public int getItemCount() {
        if(savedNews != null){
            return savedNews.size();
        }
        return 0;
    }

    //ViewHolder class
    public static class SavedNewsViewHolder extends RecyclerView.ViewHolder{

        public CardView cvNews;
        public TextView tvId;
        public ImageView ivImage;
        public TextView tvTitle;
        public TextView tvPubDate;

        public SavedNewsViewHolder(View itemView) {
            super(itemView);
            cvNews = (CardView)itemView.findViewById(R.id.cvNews);
            tvId = (TextView) itemView.findViewById(R.id.tvId);
            ivImage = (ImageView)itemView.findViewById(R.id.ivImageUrl);
            tvTitle = (TextView)itemView.findViewById(R.id.tvTitle);
            tvPubDate = (TextView)itemView.findViewById(R.id.tvPubDate);

        }
    }
}

NPE

E/AndroidRuntime: FATAL EXCEPTION: main
                                                   Process: com.cvsuimus.theflare, PID: 23967
                                                   java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
                                                       at com.cvsuimus.theflare.FavoriteNewsFragment.loadSavedNews(FavoriteNewsFragment.java:67)
                                                       at com.cvsuimus.theflare.FavoriteNewsFragment.snackInternet(FavoriteNewsFragment.java:83)
                                                       at com.cvsuimus.theflare.FavoriteNewsFragment.checkConnection(FavoriteNewsFragment.java:74)
                                                       at com.cvsuimus.theflare.FavoriteNewsFragment.onCreateView(FavoriteNewsFragment.java:38)

0 个答案:

没有答案
相关问题