как получить JSONArray из общих настроек в Adapter - PullRequest
0 голосов
/ 30 апреля 2018

В первом упражнении для загрузки в мое приложение я положил JSONArray в Sharedpreferences (как String):

    //put myJsonArray into shared preferences file as a String
    //Convert back to Json later, in the adapter
    SharedPreferences sharedPrefs = getSharedPreferences("MyData", Context.MODE_PRIVATE);
    //we want to edit SharedPreferences
    SharedPreferences.Editor editor = sharedPrefs.edit();
    //put the string value into SharedPreferences, with the key "key_value"
    editor.putString("key_value", myJsonArray.toString());
    //commit the string
    editor.commit();

Я могу получить это string в другом Activity и преобразовать его обратно в JSONArray легко с помощью:

SharedPreferences sharedPrefs = getSharedPreferences("MyData", Context.MODE_PRIVATE);
        String json_array = sharedPrefs.getString("key_value", "0");
        try
        {
            JSONArray jsonArray = new JSONArray(json_array);

        } catch (JSONException e) {
            Log.e("MYAPP", "unexpected JSON exception", e);
        }

Но когда я помещаю вышеуказанный код в onBindViewHolder моего adapter или где-либо еще в моем adapter, я получаю: NullPointerException, и мое приложение вылетает.

Пожалуйста, скажите мне, как я могу решить эту проблему.

Там, где он падает, написано:

 java.lang.NullPointerException at com.example.chris.tutorialspoint.SharedReviews.SharedPopulistoReviewsAdapter.onBindViewHolder(SharedPopulistoReviewsAdapter.java:130)

Мой onBindViewHolder код:

 @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, final int position) {


        SharedReview r = the_Shared_reviews.get(position);

        SharedPreferences sharedPrefs = context.getSharedPreferences("MyData", Context.MODE_PRIVATE);
        String json_array = sharedPrefs.getString("key_value", "0");
        try
        {
            JSONArray jsonArray = new JSONArray(json_array);
            System.out.println("SharedAdapter, the jsonarray is :" + jsonArray);


        } catch (JSONException e) {
            Log.e("MYAPP", "unexpected JSON exception", e);
        }

        ((ReviewHolder) viewHolder).category.setText("Category: " + r.getCategory());
        ((ReviewHolder) viewHolder).name.setText("Name: " + r.getName());
        ((ReviewHolder) viewHolder).phone.setText("Phone: " + r.getPhone());
        ((ReviewHolder) viewHolder).comment.setText("Your Comment: " + r.getComment());

        //set an onClick listener for the row, if it's clicked anywhere
        ((ReviewHolder) viewHolder).itemView.setOnClickListener(new View.OnClickListener() {

            @Override
            //When the review is clicked in PopulistoListView
            //then show that review
            public void onClick(View v) {

                SharedReview sharedReview = (SharedReview) SharedPopulistoReviewsAdapter.getItem(position);

                //we want to pass the review_id of the sharedReview being clicked
                //to the ViewContact activity, and from there post it and get more
                //info for that sharedReview - address, comments etc
                Intent i = new Intent(v.getContext(), ViewContact.class);
                //pass the review_id to ViewContact class
                i.putExtra("review_id", sharedReview.getReviewid());
                v.getContext().startActivity(i);
            }

        });
    }

Line 130:

SharedPreferences sharedPrefs = context.getSharedPreferences("MyData", Context.MODE_PRIVATE);

1 Ответ

0 голосов
/ 01 мая 2018

Это происходит потому, что вы не инициализировали context. Либо вы должны инициализировать context, передавая контекст в качестве параметра при создании объекта адаптера, либо вы можете получить контекст из представления. Чтобы получить контекст из представления, измените строку на:

SharedPreferences sharedPrefs = ((ReviewHolder) viewHolder).category.getContext().getSharedPreferences("MyData", Context.MODE_PRIVATE);

...