Потеря данных при навигации между фрагментами - PullRequest
0 голосов
/ 24 марта 2020

Я новичок ie в android разработке. У меня есть 3 фрагмента с именами Il, Ilce, AdresFragment. У фрагментов Ilce и Ilce есть recylerview для отображения элементов, а также есть макет строки для элементов recylerview. Макет AdresFragment имеет 2 textview который показывает данные, возвращенные Il и Ilce Fragments.AdresFragment, как показано на рисунке. AdresFragment Когда вы переходите к IlFragment и выбираете из него элемент, затем go назад к AdresFragment, это выглядит как этот . Проблема возникает, когда вы переходите к IlceFragment выберите элемент из него и снова вернитесь в AdresFragment, мое текстовое представление Il исчезает, и AdresFragment выглядит как этот . Я передаю данные между фрагментами, используя связки.

public class AdresFragment extends Fragment {
Fragment fragment=null;
RelativeLayout ilRelative,ilceRelative;
TextView ilView,ilceView,mahalleView; 

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v=inflater.inflate(R.layout.fragment_adres,container,false);
    ilView=v.findViewById(R.id.ilView);
    ilceView=v.findViewById(R.id.ilceTextView);
    mahalleView=v.findViewById(R.id.mahalleView);
    ilRelative=v.findViewById(R.id.ilSecimi);
    ilceRelative=v.findViewById(R.id.ilceSecimi);
    savedInstanceState=this.getArguments();
    if(savedInstanceState!=null) {
        String il = savedInstanceState.getString("il");
        ilView.setText(il);
        String ilce=savedInstanceState.getString("ilce");
        ilceView.setText(ilce);

    }
    return v;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    ilRelative.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            fragment=new Il();
            replaceFragment(fragment);
        }
    });}
public void replaceFragment(Fragment someFragment) {
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.ilanBody, someFragment);
   transaction.addToBackStack(null);
    transaction.commit();
}
}

Вышеуказанный фрагмент кода принадлежит AdresFragment, а ниже - IlFragment

public class Il extends Fragment{
RecyclerView recyclerView;
RelativeLayout relativeLayout;
private List<ListItem> listItems;   
MyAdapter myAdapter;   

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v=inflater.inflate(R.layout.fragment_il,container,false);

} @Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    relativeLayout=(RelativeLayout)getView().findViewById(R.id.relativeRow);
    recyclerView=(RecyclerView)getView().findViewById(R.id.ilRecyle);
    recyclerView.setHasFixedSize(true);
    listItems=new ArrayList<>();
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    loadRecylerData();
}
private void loadRecylerData(){
    final ProgressDialog progressDialog=new ProgressDialog(getActivity());
    progressDialog.setMessage("Loading data....");
    progressDialog.show();
    StringRequest stringRequest=new StringRequest(Request.Method.GET,
            URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    progressDialog.dismiss();
                    try {
                        JSONArray jsonArray=new JSONArray(response);
                        for (int i = 0; i < jsonArray.length(); i++) {
                            JSONObject jsonObject=jsonArray.getJSONObject(i);
                            ListItem item=new ListItem(
                                    new String(jsonObject.getString("province").getBytes("ISO-8859-1"),"UTF-8"));
                            listItems.add(item);
                        }
                        myAdapter=new MyAdapter(getActivity().getApplicationContext(),listItems);
                        recyclerView.setAdapter(myAdapter);
                        myAdapter.notifyDataSetChanged();
                        myAdapter.setOnItemClickListner(new MyAdapter.onItemClickListner() {
                            @Override
                            public void onClick(String str) {
                                String il=str;
                               AdresFragment adresFragment=new AdresFragment();
                                Bundle args=new Bundle();
                                args.putString("il",il);
                                adresFragment.setArguments(args);
                                getFragmentManager().beginTransaction().add(R.id.ilanBody,adresFragment).commit();
                            }
                        });

                    } catch (JSONException e) {
                        e.printStackTrace();
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    progressDialog.dismiss();
                    Toast.makeText(getActivity(),error.getMessage(),Toast.LENGTH_LONG).show();
                }
            });
    RequestQueue requestQueue= Volley.newRequestQueue(getActivity());
    requestQueue.add(stringRequest);
}

MyAdapter

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{

private Context context;
private List<ListItem> listItems;
onItemClickListner onItemClickListner;

public void setOnItemClickListner(MyAdapter.onItemClickListner onItemClickListner) {
    this.onItemClickListner = onItemClickListner;
}

public interface onItemClickListner{
    void onClick(String str);
}


public MyAdapter(Context context, List<ListItem> listItems) {
    this.context = context;
    this.listItems = listItems;


}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater = LayoutInflater.from(context);
    View view = layoutInflater.inflate(R.layout.recylerview_row, parent, false);
    return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    final ListItem listItem = listItems.get(position);


    holder.myTextView.setText(listItem.getIl());
    holder.relativeLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onItemClickListner.onClick(listItem.getIl());


        }

    });

}
public String getItem(int position){
    return listItems.get(position).getIl();
}

@Override
public int getItemCount() {
    return listItems.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
    public RelativeLayout relativeLayout;
    TextView myTextView;

    MyViewHolder(View itemView) {
        super(itemView);
        myTextView = itemView.findViewById(R.id.ilTextView);
        relativeLayout=(RelativeLayout)itemView.findViewById(R.id.relativeRow);

    }



}

Я хочу сохранить обе данные.

Заранее спасибо!

1 Ответ

0 голосов
/ 24 марта 2020

Поскольку вы не используете какое-либо внедрение зависимостей, вы можете использовать что-то вроде этого:

public enum Repository {
    INSTANCE;

    private List<String> items = new ArrayList<>();


    public void addItem(String item) {
        this.items.add(item);
    }


    public List<String> getItems() {
        return new ArrayList<String>(this.items);
    }
}

А затем в вашем AdresFragment:

public class AdresFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ...
        myAdapter.addItems(Repository.INSTANCE.getItems())
        ...
    }
}
...