对话框显示后如何从 RecyclerView 恢复刷过的项目?

如何解决对话框显示后如何从 RecyclerView 恢复刷过的项目?

我将 itemtouchhelperAlertDialog 一起使用。问题是当用户将元素滑动到右侧时。 AlertDialogEditText 显示在屏幕上。现在我想做这样的事情:

  • 用户按下“保存”button 时,元素消失不会被移除,只会从整个 RecyclerView 列表中“消失”。

  • 当“取消”button被按下时,元素应该返回到它之前的同一个位置(这将是mAdapter.notifyItemChanged();或{{1}的动画很漂亮}}

所以我尝试了两种解决方案,但都没有成功。

mAdapter.notifyItemInserted();

首先我尝试实现我自己的界面,在用户按下“取消”后 itemtouchhelper = new itemtouchhelper(new itemtouchhelper.SimpleCallback(0,itemtouchhelper.RIGHT) { @Override public boolean onMove(@NonNull RecyclerView recyclerView,@NonNull RecyclerView.ViewHolder viewHolder,@NonNull RecyclerView.ViewHolder target) { return false; } @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder,int direction) { position = viewHolder.getAbsoluteAdapterPosition(); // 2. solution openDialog(); vieholder2 = viewHolder; // 1. Solution } }); itemtouchhelper.attachToRecyclerView(recyclerView); 界面应该被调用并设置下面的代码
button

第二:

调用接口后我设置itemtouchhelper.startSwipe(vieholder2);
两种解决方案都很好,直接在 mAdapter.notifyItemChanged(position); 中的 onSwiped 方法中运行,但在方法被触发后显示 itemtouchhelper解决方案不起作用。

那么如何在点击 Dialog 上的“取消”RecyclerView 后将不可见的项目返回到 button 列表?

如果有帮助,我正在使用 LiveData。

编辑
片段类。

Dialog

我的适配器。

package com.example.application;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.viewmodelProvider;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.itemtouchhelper;
import androidx.recyclerview.widget.linearlayoutmanager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
/**
 * A simple {@link Fragment} subclass.
 * Use the {@link Main_Database_fragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class Main_Database_fragment extends Fragment implements Dialog_Amount.Dialog_AmountListener {

    private View rootView;
    private RecyclerView recyclerView;
    private Recycler_Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    private Item_get_viewmodeL item_get_viewmodel;
    private ActivityResultLauncher<Intent> start_next_activity;
    private Item_get item_get;
    int pospos;
    itemtouchhelper itemtouchhelper;
    RecyclerView.ViewHolder viewholder;
    int deleted = 0;
    private int id;
    private int type;
    private int package_category;
    Item_get item_get2;
    int positionItem;
    // Todo: Rename parameter arguments,choose names that match
    // the fragment initialization parameters,e.g. ARG_ITEM_NUMBER
    private static final String ARG_ParaM1 = "param1";
    private static final String ARG_ParaM2 = "param2";
    // Todo: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    public Main_Database_fragment() {
        // required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment Main_Database_fragment.
     */
    // Todo: Rename and change types and number of parameters
    public static Main_Database_fragment newInstance(String param1,String param2) {
        Main_Database_fragment fragment = new Main_Database_fragment();
        Bundle args = new Bundle();
        args.putString(ARG_ParaM1,param1);
        args.putString(ARG_ParaM2,param2);
        fragment.setArguments(args);
        return fragment;
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_ParaM1);
            mParam2 = getArguments().getString(ARG_ParaM2);
        }

    }

    @Override
    public View onCreateView(final LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_main__database_fragment,container,false);
        return rootView;
    }


    @Override
    public void onViewCreated(@NonNull final View view,@Nullable final Bundle savedInstanceState) {
        build_RecyclerView();
        mAdapter.setonItemClickListener(new Recycler_Adapters_items() {

            @Override
            public void onEditClick(Item_get item_get) {
                Intent intent = new Intent(getActivity(),Edit_Delete_details.class);
                type = item_get.food.getCode();
                package_category = item_get.package_type.getCode();
                intent.putExtra(Edit_Delete_details.EXTRA_DATA,item_get);
                intent.putExtra(Edit_Delete_details.EXTRA_ID,item_get.getId());
                intent.putExtra(Edit_Delete_details.EXTRA_CATEGORY,type);
                intent.putExtra(Edit_Delete_details.EXTRA_PACKAGE_TYPE,package_category);
                start_next_activity.launch(intent);
            }

            @Override
            public void onDeleteClick(Item_get item_get) {
                item_get_viewmodel.delete(item_get);
            }

            @Override
            public void onItemClick(Item_get item_get) {
                Intent intent = new Intent(getActivity(),Product_specific_detail.class);
                intent.putExtra(Product_specific_detail.EXTRA_ID_2,item_get.getId());
                start_next_activity.launch(intent);

            }
        });
        item_get_viewmodel = new viewmodelProvider(this).get(Item_get_viewmodeL.class);
        item_get_viewmodel.getAll_ItemsModel().observe(getViewLifecycleOwner(),new Observer<List<Item_get>>() {
            @Override
            public void onChanged(List<Item_get> item_gets) {
                mAdapter.submitList(item_gets);
                mAdapter.copylist(item_gets);
            }
        });

        itemtouchhelper = new itemtouchhelper(new itemtouchhelper.SimpleCallback(0,@NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder,int direction) {

                positionItem = viewHolder.getAbsoluteAdapterPosition();
                openDialog();
                item_get2 = mAdapter.getItemAt(viewHolder.getAbsoluteAdapterPosition());
                deleted = viewHolder.getAbsoluteAdapterPosition();
                viewholder = viewHolder;
            }
        });
        itemtouchhelper.attachToRecyclerView(recyclerView);
        super.onViewCreated(view,savedInstanceState);
    }
    public void build_RecyclerView(){
        recyclerView = rootView.findViewById(R.id.recycler_edit_del_product);
        recyclerView.setHasFixedSize(true);
        mLayoutManager = new linearlayoutmanager(getActivity());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        mAdapter = new Recycler_Adapter();
        recyclerView.setAdapter(mAdapter);
        start_next_activity = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),new ActivityResultCallback<ActivityResult>() {
                    @Override
                    public void onActivityResult(ActivityResult result) {
                        if(result.getResultCode() == Activity.RESULT_OK){
                            Intent intent = result.getData();
                            assert intent != null;
                            id = intent.getIntExtra(Edit_Delete_details.EXTRA_ID,-1);
                            if(id == -1){
                                Toast.makeText(getContext(),"Error",Toast.LENGTH_SHORT).show();
                                return;
                            }else if(id == -5){
                                item_get = intent.getParcelableExtra(Edit_Delete_details.EXTRA_DATA);
                                item_get.setId(id);
                                item_get_viewmodel.delete(item_get);
                                Toast.makeText(getContext(),"Delete",Toast.LENGTH_SHORT).show();
                            }else {
                                item_get = intent.getParcelableExtra(Edit_Delete_details.EXTRA_DATA);
                                type = intent.getIntExtra(Edit_Delete_details.EXTRA_CATEGORY,-1);
                                package_category = intent.getIntExtra(Edit_Delete_details.EXTRA_PACKAGE_TYPE,-1);
                                if(type == -1){
                                    Toast.makeText(getContext(),"Category may not be updated",Toast.LENGTH_LONG).show();
                                }else {
                                    set_food_type(type);
                                }
                                if(package_category == -1){
                                    Toast.makeText(getContext(),"Packages may not be updated",Toast.LENGTH_LONG).show();
                                }else {
                                    set_packages_type(package_category);
                                }
                                item_get.setId(id);
                                item_get_viewmodel.update(item_get);
                                Toast.makeText(getContext(),"Update",Toast.LENGTH_SHORT).show();
                            }
                        }
                    }
                }
        );

    }


    //Set our foodType from int to enum and later we pass it to db to update;
    public void set_food_type(int type){
        switch (type){
            case 1:
                item_get.food = Item_get.Food.SWEETS;
                break;
            case 2:
                item_get.food = Item_get.Food.vegetaBLES_FRUITS;
                break;
            case 3:
                item_get.food = Item_get.Food.DRINKS;
                break;
            case 4:
                item_get.food = Item_get.Food.OTHER;
                break;
            default:
                break;
        }
    }
    // Same as it is with food. Difference is Package Category enum not Package Type enum;
    public void set_packages_type(int type){
        switch (type){
            case 1:
                item_get.package_type = Item_get.Package_type.PACKAGE_Box;
                break;
            case 2:
                item_get.package_type = Item_get.Package_type.PIECE;
                break;
            case 3:
                item_get.package_type = Item_get.Package_type.OTHER_PACK;
                break;
            default:
                break;
        }
    }
    public void openDialog(){
        Dialog_Amount dialog_amount = new Dialog_Amount();
        dialog_amount.setCancelable(false);
        dialog_amount.show(getChildFragmentManager(),"This is dialog");
    }

    @Override
    public void applyText(int text) {
        if(text != -1){
            item_get2.setNameProduct(item_get2.getNameProduct());
            item_get2.setDate_buy(null);
            item_get2.setAmount(0);
            int a = item_get2.food.getCode();
            int b = item_get2.package_type.getCode();
            item_get2.setPrice(0.0);
            item_get2.setValue(0.0);
            item_get2.setTo_shop(1);
            item_get2.setAmount_toShop(text);
            item_get_viewmodel.update(item_get2);

        }else {
            mAdapter.add_SingleItem(positionItem,item_get2);
            mAdapter.notifyItemInserted(positionItem);
        }
    }
}

解决方法

您需要在 Fragment 类中执行此操作

  madapter.notifyItemChanged(viewholder.getAbsoluteAdapterPostion());

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?