首页 > 解决方案 > 在 TAB 1 的 RecyclerView 中添加数据时更新 TAB 2 Recyclerview

问题描述

我有种to-do app。在个人资料活动中,有 2 个选项卡。 To-doDone。在选项卡 1 中,用户可以将他们的“待办事项”检查为“完成”。在这种情况下,我想更新TAB 2's recyclerview.

我尝试了几件事,但没有奏效。这是 TAB 1 代码,它与 TAB 2 几乎相同。

选项卡 1 类

公共类 Tab_Profile_1 扩展片段 {

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_Profile_ToDo 扩展 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();
}

}

标签: javaandroidandroid-studioandroid-fragments

解决方案


如果我没看错,您有两个选项卡和一个后端数据库,用于存储待办事项及其状态?要更新第二个列表,您只需执行与第一个列表中相同的操作,更新适配器的数据集并通知数据集已更改。如何在第二个选项卡中触发此操作确实是个问题。

您可以使用一个接口并让您的适配器通知您的活动回收器视图 1 对其进行了操作,然后您可以告诉适配器 2 更新其数据。您可以传回数据并只通知一行,也可以通知整个数据集。如果您正在基于所有服务执行此操作,则只需从服务重新加载回收器视图,它将具有新数据。

我认为您需要弄清楚的是如何通知选项卡 2 它需要更新其数据。我的建议是:

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

然后在您的适配器内部有一个带有 getter/setter 的属性,例如:

private AdapterInterface adapterInterfaceListener;

在您的 Fragment/Activity 内部实现 AdapterInterface 并实现 itemCompleted 函数。

然后将您的 adapter.setAdapterInterfaceLisetener 设置为您实现的那个函数。然后在您的适配器内部,当用户单击支票簿将其标记为完成时,您可以调用 adapterInterfaceListener.itemCompleted() 函数,它将该信息发送到您的 Fragment/Activity。从那里您可以将新数据提供给适配器 2,或者调用 API,但是您想要获取新数据。

这有帮助吗?


推荐阅读