如何解决对话框显示后如何从 RecyclerView 恢复刷过的项目?
我将 itemtouchhelper
与 AlertDialog
一起使用。问题是当用户将元素滑动到右侧时。 AlertDialog
和 EditText
显示在屏幕上。现在我想做这样的事情:
-
当用户按下“保存”
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 举报,一经查实,本站将立刻删除。