keremoflu4
keremoflu4

Reputation: 111

Update TAB 2 Recyclerview When Data Added in TAB 1's RecyclerView

I have kind of to-do app. In profile activity, there are 2 tabs. To-do and Done. In Tab 1, user can check as "done" of their "to-do". In this case, I want to update TAB 2's recyclerview.

I tried several things, but didn't work. Here is TAB 1 codes, it's almost same as TAB 2.

TAB 1 Class

public class Tab_Profile_1 extends Fragment {

private RecyclerView recyclerView_tab_todo;
private List<Model_ListItem> itemList;
private Adapter_Profile_ToDo adapter_profile_toDo;
SharedPreferences mSharedPref;

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

    View view = inflater.inflate(R.layout.fragment_profile_tab_1, container, false);

    //TO-DO

    //
    recyclerView_tab_todo = view.findViewById(R.id.recyclerView_tab_todo);
    //
    fetchUserToDo();


    return view;
}

public void fetchUserToDo() {

    itemList = new ArrayList<>();

    //First Settings
    mSharedPref = PreferenceManager.getDefaultSharedPreferences(getContext());
    String session_user_id = mSharedPref.getString("session_user_id", "");

    API_Service api_service = Client.getRetrofitInstance().create(API_Service.class);

   Call<List<Model_ListItem>> call = api_service.fetchUserToDo(session_user_id);

   call.enqueue(new Callback<List<Model_ListItem>>() {
       @Override
       public void onResponse(Call<List<Model_ListItem>> call, Response<List<Model_ListItem>> response) {

           itemList = response.body();

           adapter_profile_toDo = new Adapter_Profile_ToDo(getContext(), itemList);
           recyclerView_tab_todo.setHasFixedSize(true);
           LinearLayoutManager layoutManager
                   = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
           recyclerView_tab_todo.setLayoutManager(layoutManager);
           recyclerView_tab_todo.setAdapter(adapter_profile_toDo);



       }

       @Override
       public void onFailure(Call<List<Model_ListItem>> call, Throwable t) {

       }
   });
}}

TAB 1 RecyclerView Adapter

public class Adapter_Profile_ToDo extends RecyclerView.Adapter {

private Context context;
private List<Model_ListItem> itemList;
private String url_extension_images = URL_Extension.url_extension_images;
SharedPreferences mSharedPref;
ProgressDialog progressDialog;
View view;

public Adapter_Profile_ToDo(Context context, List<Model_ListItem> itemList) {
    this.context = context;
    this.itemList = itemList;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_profile_todo, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {

    Glide.with(context).load(url_extension_images + itemList.get(position).getItem_image()).into(holder.imageView_profile_todo);
    holder.textView_profile_todo_name.setText(itemList.get(position).getItem_name());
    holder.textView_profile_todo_desc.setText(itemList.get(position).getItem_description());

    holder.layout_profile_todo_detail.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //detail
        }
    });

    holder.layout_profile_todo_add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            final AlertDialog.Builder builder = new AlertDialog.Builder(view.getRootView().getContext(), R.style.AlertStyle);
            builder.setTitle("\"" + itemList.get(position).getItem_name() + "\"" + "\n");
            builder.setIcon(R.drawable.ic_bookmark);

            builder.setPositiveButton("YAPTIM", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    showProgressDialog();
                    addDone("" + itemList.get(position).getItem_id(), position);
                }
            });

            builder.setNegativeButton("SİL", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    showProgressDialog();
                    deleteUserToDo("" + itemList.get(position).getItem_id(), position);
                }
            });

            builder.setNeutralButton("İptal", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });

            builder.show();
        }
    });

}

@Override
public int getItemCount() {
    return itemList.size();
}


public class ViewHolder extends RecyclerView.ViewHolder {

    ImageView imageView_profile_todo;
    TextView textView_profile_todo_name, textView_profile_todo_desc;
    LinearLayout layout_profile_todo_detail, layout_profile_todo_add;

    public ViewHolder(View itemView) {
        super(itemView);

        imageView_profile_todo = itemView.findViewById(R.id.imageView_profile_todo);
        textView_profile_todo_name = itemView.findViewById(R.id.textView_profile_todo_name);
        textView_profile_todo_desc = itemView.findViewById(R.id.textView_profile_todo_desc);
        layout_profile_todo_detail = itemView.findViewById(R.id.layout_profile_todo_detail);
        layout_profile_todo_add = itemView.findViewById(R.id.layout_profile_todo_add);
    }
}

public void deleteUserToDo(final String listId, final int clicked) {
    mSharedPref = PreferenceManager.getDefaultSharedPreferences(context);
    String session_user_id = mSharedPref.getString("session_user_id", "");

    API_Service api_service = Client.getRetrofitInstance().create(API_Service.class);
    Call<Response_Success> call = api_service.deleteUserToDo(session_user_id, listId);

    call.enqueue(new Callback<Response_Success>() {
        @Override
        public void onResponse(Call<Response_Success> call, Response<Response_Success> response) {

            if (response.code() == 200) {

                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                    progressDialog = null;
                }

                if (response.body().getSuccess().matches("true")) {
                    Toast.makeText(context, "Silindi!", Toast.LENGTH_SHORT).show();
                    itemList.remove(itemList.get(clicked));
                    notifyItemRemoved(clicked);
                    notifyItemRangeChanged(clicked, itemList.size());
                } else {
                    Toast.makeText(context, "Bilinmeyen bir hata oluştu!", Toast.LENGTH_SHORT).show();
                }

            }


        }

        @Override
        public void onFailure(Call<Response_Success> call, Throwable t) {
            Toast.makeText(context, "Bilinmeyen bir hata oluştu!", Toast.LENGTH_SHORT).show();
        }
    });

}

public void addDone(String listId, final int clicked) {
    mSharedPref = PreferenceManager.getDefaultSharedPreferences(context);
    String session_user_id = mSharedPref.getString("session_user_id", "");

    API_Service apiService = Client.getRetrofitInstance().create(API_Service.class);
    Call<Response_Success> call = apiService.addDone(session_user_id, listId);

    call.enqueue(new Callback<Response_Success>() {
        @Override
        public void onResponse(Call<Response_Success> call, Response<Response_Success> response) {

            if (response.code() == 200) {

                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                    progressDialog = null;
                }

                if (response.body().getSuccess().matches("true")) {
                    Toast.makeText(context, "Eklendi", Toast.LENGTH_SHORT).show();

                    itemList.remove(itemList.get(clicked));
                    notifyItemRemoved(clicked);
                    notifyItemRangeChanged(clicked, itemList.size());


                } else {
                    Toast.makeText(context, "Bilinmeyen bir hata oluştu!", Toast.LENGTH_SHORT).show();
                }

            }

        }

        @Override
        public void onFailure(Call<Response_Success> call, Throwable t) {

        }
    });
}

public void showProgressDialog() {
    progressDialog = new ProgressDialog(view.getRootView().getContext());
    progressDialog.setMessage("Yükleniyor");
    progressDialog.setCancelable(false);
    progressDialog.show();
}

}

Upvotes: 0

Views: 151

Answers (1)

Kyle
Kyle

Reputation: 1524

If i'm reading this correctly, you have two tabs and a backend database that stores the to do items and their state? To get the second list to update, you just need to do the same thing that you're doing in your first list, and update the adapter's data set and notify that the data set changed. How you trigger this action in your second tab is really the question.

You can either use an interface and have your adapter notify your activity that recycler view 1 had an action on it, and you can then tell adapter 2 to update its data. You can either pass back the data and only notify one row, or you could notify the entire data set. If you're doing this all service based, you could just reload the recycler view from the service and it will have the new data.

I think all you need to figure out is how you want to notify tab 2 that it needs to update its data. My recommendation is:

public interface AdapterInterface
{
    void itemCompleted(Item hereIsTheItemThatNeedsToBeAddedTo2);
}

Then inside your adapter have a property with getters/setters such as:

private AdapterInterface adapterInterfaceListener;

Inside your Fragment/Activity implement AdapterInterface and implement the itemCompleted function.

And then set your adapter.setAdapterInterfaceLisetener to that function that you implemented. Then inside your adapter when the user clicks the checkbook to mark it as done, you can call the adapterInterfaceListener.itemCompleted() function, and it will send that information to your Fragment/Activity. From there you can give that new data to adapter2, or recall the API, however you want to get the new data.

Does this help?

Upvotes: 1

Related Questions