Как я могу обновить sh фрагмент, который открыл действие, а затем закрыть действие обратно на фрагмент - PullRequest
0 голосов
/ 14 июля 2020

Я хочу обновить / перезагрузить фрагмент сразу после возврата из действия, которое изменило его значения.

  • Я открыл действие из моего фрагмента
  • В этом действии я обновил некоторые SQL, которые отображаются во фрагменте
  • Затем я вернулся к фрагменту, используя finish();, который отправляет меня обратно к фрагменту

Я пробовал использовать onResume() с adapter.notifyDataSetChanged(), но это привело к сбою приложения с этой ошибкой:

Attempt to invoke virtual method 'void com.example.tomaspap.ItemMySerieRecyclerView.MyAdapterItemMySerie.notifyDataSetChanged()' on a null object reference

Код фрагмента:

publi c класс SeriesFragment расширяет фрагмент {

private static final String TAG = "MySeriesFragment";

private final String URLBASIS = "https://api.themoviedb.org/3/tv/";
private final String URLAPIKEY = "?api_key=4946fe5b625b70f37a13e1fe882451a4";

private final String imagebaseurl = "http://image.tmdb.org/t/p/w500";

RecyclerView mRecyclerView;
MyAdapterItemMySerie mAdapter;

String serieid;
String watchstate;

private ArrayList<MySerieModel> models;

private RequestQueue mRequestQueue;
private JsonObjectRequest request;



@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v =  inflater.inflate(R.layout.fragment_series, container, false);
    models = new ArrayList<>();


    mRecyclerView = v.findViewById(R.id.series_recyclerView);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    mAdapter = new MyAdapterItemMySerie(getContext(), models);
    //mRecyclerView.setAdapter(mAdapter);



    return v;

}



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

    DBHelper db = new DBHelper(getContext());
    Cursor cursor = db.Select_All_Serie();
    models = new ArrayList<>();

    cursor.moveToFirst();
    if(cursor.getCount()==0){
        Toast.makeText(getContext(), "NO SERIES", Toast.LENGTH_SHORT).show();
    }
    if(cursor.getCount() > 0){
        do {
            serieid = cursor.getString(cursor.getColumnIndex("serieid")).toString();
            watchstate = cursor.getString(cursor.getColumnIndex("watchstate")).toString();
            Integer yourrate = cursor.getInt(cursor.getColumnIndex("yourrate"));
            Integer watchedeps = cursor.getInt(cursor.getColumnIndex("watchedeps"));
            mRequestQueue = Volley.newRequestQueue(getContext());
            parseJSON(serieid, watchstate);
            models.add(new MySerieModel(serieid, watchstate, yourrate, watchedeps));
        } while (cursor.moveToNext());
    }
//    Toast.makeText(getContext(), String.valueOf(models.size()), Toast.LENGTH_SHORT).show();
}



private void parseJSON(final String serieid, final String watchstate){

    String url = URLBASIS + serieid + URLAPIKEY;

    request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        String title = (response.getString("name"));

                        String nextepfinal = "";
                        try {
                            JSONObject jsonArraynextep = (response.getJSONObject("next_episode_to_air"));

                            nextepfinal = jsonArraynextep.getString("air_date");
                        }catch(JSONException e){}
                        String state = (response.getString("status"));
                      //  String serieid = (response.getString("id"));
                        String imageurl = (response.getString("poster_path"));
                        String image = imagebaseurl + imageurl;

                        MySerieModel serie = new MySerieModel(title, nextepfinal, state, watchstate, serieid, image);
                        models.add(serie);
                    } catch (JSONException e) {
                        e.printStackTrace();
                        return;
                    }

                    mAdapter = new MyAdapterItemMySerie(getContext(), models);
                    mRecyclerView.setAdapter(mAdapter);

                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });

    mRequestQueue.add(request);
}

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

    mAdapter.notifyDataSetChanged();
}

Спасибо Вам за помощь.

1 Ответ

0 голосов
/ 14 июля 2020

ваши методы загрузки списка разбросаны, и я уверен, что именно поэтому они вас смущают. Я бы посоветовал вам создать метод, например, updateUI(), и поместить их все в одном месте, тогда вы можете вызвать его, когда захотите обновить UI как методы onCreate() и onResume(). Также рекомендуется обрабатывать элементы списка в синглтоне, чтобы вы могли получить к ним доступ в любом месте приложения

ModelsListFragment. java

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


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



public void updateUI() {
        ModelSingleton modelSingleton = Model.get(getActivity());
        List<Model> models= modelSingleton.getModels();

        if (mAdapter == null) {
            mAdapter = new MyAdapterItemMySerie(getContext(), models);
            mRecyclerView.setAdapter(mAdapter);
        } else {
            mAdapter.setModels(models);
            mAdapter.notifyDataSetChanged();
        }

        updateSubtitle();
    }
....
...