Java recyclerview在使用搜索筛选列表后打开错误的项目
这是我的菜单片段Java recyclerview在使用搜索筛选列表后打开错误的项目,java,android,android-recyclerview,android-adapter,Java,Android,Android Recyclerview,Android Adapter,这是我的菜单片段 public class MenuFragment extends Fragment { @BindView(R.id.rvMenu) RecyclerView rvMenu; @BindView(R.id.etSearch) EditText etSearch; @BindView(R.id.llNoDataFound) LinearLayout llNoDataFound; @BindView(R.id.llSea
public class MenuFragment extends Fragment {
@BindView(R.id.rvMenu)
RecyclerView rvMenu;
@BindView(R.id.etSearch)
EditText etSearch;
@BindView(R.id.llNoDataFound)
LinearLayout llNoDataFound;
@BindView(R.id.llSearch)
LinearLayout llSearch;
RestaurantDatabase restaurantDatabase;
List<ItemTable> itemTableList;
ItemListAdapter itemListAdapter;
MySharedPreference mySharedPreference;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View root = inflater.inflate(R.layout.fragment_menu, container, false);
ButterKnife.bind(this, root);
initAll();
return root;
}
private void initAll() {
restaurantDatabase = RestaurantDatabase.getRestaurantDatabase(getContext());
mySharedPreference = new MySharedPreference(getContext());
itemTableList = new ArrayList<>();
itemListAdapter = new ItemListAdapter(getContext(), itemTableList, position -> {
ItemTable itemTable = itemTableList.get(position);
Intent intent = new Intent(getContext(), AddMenuActivity.class);
intent.putExtra("data", itemTable);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivityForResult(intent, 100);
});
rvMenu.setLayoutManager(new GridLayoutManager(getContext(), 2));
rvMenu.setItemAnimator(new DefaultItemAnimator());
rvMenu.setAdapter(itemListAdapter);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(rvMenu);
getDataFromApi();
etSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
/*
This method is called to notify you that, within s, the count characters beginning at the start are about to be replaced by new text with length after.
*/
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
/*
This method is called to notify you that, within s, the count characters beginning at the start have just replaced old text that had length before.
*/
}
@Override
public void afterTextChanged(Editable editable) {
itemListAdapter.getFilter().filter(editable.toString());
}
});
}
ItemTable deletedItem = null;
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | 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) {
int position = viewHolder.getAdapterPosition();
switch (direction) {
case ItemTouchHelper.LEFT:
direction(position);
break;
case ItemTouchHelper.RIGHT:
direction(position);
break;
default:
break;
}
}
private void direction(int position) {
deleteDataFromLocalDatabase(position);
deletedItem = itemTableList.get(position);
undoMethod(deletedItem, position);
}
@Override
public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
new RecyclerViewSwipeDecorator.Builder(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive)
.addBackgroundColor(ContextCompat.getColor(getContext(), R.color.gray))
.addActionIcon(R.drawable.ic_baseline_delete_outline_24)
.create()
.decorate();
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
};
public void undoMethod(ItemTable deletedItem, int position) {
Snackbar.make(rvMenu, "" + deletedItem.getItemName() + " is deleted Successfully", BaseTransientBottomBar.LENGTH_LONG)
.setAction("Undo", view -> {
itemTableList.add(position, deletedItem);
itemListAdapter.notifyItemChanged(position);
try {
Thread thread = new Thread() {
@Override
public void run() {
Looper.prepare();
/*
do In background
* */
ItemTable itemTable;
try {
itemTable = new ItemTable(deletedItem.getItemName(), deletedItem.getItemImage(), deletedItem.getItemPrice(),mySharedPreference.getrdRestaurantName());
} catch (NumberFormatException ex) {
itemTable = new ItemTable(deletedItem.getItemName(), deletedItem.getItemImage(), 0,mySharedPreference.getrdRestaurantName());
}
Long aLong = restaurantDatabase.getItemDao().insertItemTable(itemTable);
final Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
/*
post background
* */
if (aLong > 0) {
getDataFromApi();
} else {
Toast.makeText(getContext(), "Insert Failed", Toast.LENGTH_SHORT).show();
}
handler.removeCallbacks(this);
}
}, 0000);
Looper.loop();
}
};
thread.start();
} catch (Exception ex) {
Log.e("error =>", "" + ex.getMessage());
ex.printStackTrace();
}
}).show();
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 100 && resultCode == Activity.RESULT_OK) {
getDataFromApi();
}
}
@OnClick(R.id.fbtnAdd)
public void onbtnAddClick() {
Intent intent = new Intent(getContext(), AddMenuActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivityForResult(intent, 100);
getActivity().overridePendingTransition(R.anim.slide_up,
R.anim.slide_down);
}
public void getDataFromApi() {
try {
Thread thread = new Thread() {
@Override
public void run() {
Looper.prepare();
/*
do In background
* */
List<ItemTable> itemTables = restaurantDatabase.getItemDao().fetchAllItemTableData(mySharedPreference.getrdRestaurantName());
final Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(() -> {
/*
post background
* */
itemTableList.clear();
itemTableList.addAll(itemTables);
if (itemTableList.isEmpty()) {
mySharedPreference.setMenuSwipeValue(true);
llNoDataFound.setVisibility(View.VISIBLE);
llSearch.setVisibility(View.GONE);
} else {
llNoDataFound.setVisibility(View.GONE);
llSearch.setVisibility(View.VISIBLE);
}
if (itemTableList.size() > 1) {
mySharedPreference.setMenuSwipeValue(false);
}
if (itemTableList.size() == 1 && mySharedPreference.getMenuSwipeValue()) {
showSwipeDialog();
}
itemListAdapter.notifyDataSetChanged();
}, 0000);
Looper.loop();
}
};
thread.start();
} catch (Exception ex) {
Log.e("ERROR =>", "" + ex.getMessage());
ex.printStackTrace();
}
}
public void deleteDataFromLocalDatabase(int position) {
try {
Thread thread = new Thread() {
@Override
public void run() {
Looper.prepare();
/*
do In background
* */
int delete = restaurantDatabase.getItemDao().deleteItemTableData(itemTableList.get(position));
Boolean aBoolean;
if (delete > 0) {
aBoolean = true;
} else {
aBoolean = false;
}
final Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
/*
post background
* */
if (Boolean.TRUE.equals(aBoolean)) {
getDataFromApi();
} else {
Toast.makeText(getContext(), "Failed Delete Item", Toast.LENGTH_SHORT).show();
}
handler.removeCallbacks(this);
}
}, 0000);
Looper.loop();
}
};
thread.start();
} catch (Exception ex) {
Log.e("ERROR =>", "" + ex.getMessage());
ex.printStackTrace();
}
}
private void showSwipeDialog() {
Dialog dialogSwipe = new Dialog(getActivity(), android.R.style.Theme_Dialog);
dialogSwipe.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialogSwipe.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialogSwipe.setContentView(R.layout.dialog_swipe_left_right);
dialogSwipe.show();
dialogSwipe.setCancelable(false);
TextView tvGotIt = (TextView) dialogSwipe.findViewById(R.id.tvGotIt);
tvGotIt.setOnClickListener(view -> {
dialogSwipe.dismiss();
mySharedPreference.setMenuSwipeValue(false);
});
}
}
公共类MenuFragment扩展片段{
@BindView(R.id.rv菜单)
回收视图菜单;
@BindView(R.id.etSearch)
编辑文本搜索;
@BindView(R.id.llNoDataFound)
找到线性布局llnodata;
@BindView(R.id.llSearch)
线性布局搜索;
餐厅数据库餐厅数据库;
列表项TableList;
ItemListAdapter ItemListAdapter;
MySharedPreference MySharedPreference;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图根=充气机。充气(R.layout.fragment\u菜单,容器,错误);
把(这个,根)绑起来;
initAll();
返回根;
}
私有void initAll(){
restaurantDatabase=restaurantDatabase.getRestaurantDatabase(getContext());
mySharedPreference=newmysharedpreference(getContext());
itemTableList=新的ArrayList();
itemListAdapter=新的itemListAdapter(getContext(),itemTableList,位置->{
ItemTable ItemTable=itemTableList.get(位置);
Intent Intent=new Intent(getContext(),AddMenuActivity.class);
intent.putExtra(“数据”,项目表);
intent.setFlags(intent.FLAG_ACTIVITY_CLEAR_TASK | intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivityForResult(意向,100);
});
setLayoutManager(新的GridLayoutManager(getContext(),2));
rvMenu.setItemAnimator(新的DefaultItemAnimator());
rvMenu.setAdapter(itemListAdapter);
ItemTouchHelper ItemTouchHelper=新的ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(rvMenu);
getDataFromApi();
etSearch.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前的公共无效(CharSequence CharSequence,int i,int i1,int i2){
/*
调用此方法是为了通知您,在s内,从开始处开始的计数字符将被长度在后的新文本替换。
*/
}
@凌驾
public void onTextChanged(CharSequence CharSequence,int i,int i1,int i2){
/*
调用此方法是为了通知您,在s内,从开始处开始的计数字符刚刚替换了以前具有长度的旧文本。
*/
}
@凌驾
public void PostTextChanged(可编辑){
itemListAdapter.getFilter().filter(可编辑的.toString());
}
});
}
ItemTable deletedItem=null;
ItemTouchHelper.SimpleCallback SimpleCallback=新建ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT){
@凌驾
公共布尔onMove(@NonNull RecyclerView RecyclerView,@NonNull RecyclerView.ViewHolder ViewHolder,@NonNull RecyclerView.ViewHolder target){
返回false;
}
@凌驾
公共void onsweed(@NonNull RecyclerView.ViewHolder ViewHolder,int-direction){
int position=viewHolder.getAdapterPosition();
开关(方向){
case ItemTouchHelper.LEFT:
方向(位置);
打破
case ItemTouchHelper.RIGHT:
方向(位置);
打破
违约:
打破
}
}
专用空位方向(内部位置){
deleteDataFromLocalDatabase(位置);
deletedItem=itemTableList.get(位置);
撤消方法(删除数据项、位置);
}
@凌驾
public void onchildraw(@NonNull Canvas c、@NonNull recycleriew recycleriew、@NonNull recycleriew.ViewHolder ViewHolder、float dX、float dY、int actionState、boolean isCurrentlyActive){
新的RecyclerViewSweepDecorator.Builder(c、recyclerView、viewHolder、dX、dY、actionState、isCurrentlyActive)
.addBackgroundColor(ContextCompat.getColor(getContext(),R.color.gray))
.addActionIcon(R.drawable.ic\u基线\u删除\u大纲\u 24)
.create()
.装饰();
super.onchildraw(c、recyclerView、viewHolder、dX、dY、actionState、isCurrentlyActive);
}
};
公共void撤消方法(ItemTable deletedItem,int位置){
Snackbar.make(rvMenu,“+deletedItem.getItemName()+”已成功删除”,BaseTransientBottomBar.LENGTH\u LONG)
.setAction(“撤消”,查看->{
itemTableList.add(位置,删除项);
itemListAdapter.notifyItemChanged(位置);
试一试{
线程线程=新线程(){
@凌驾
公开募捐{
Looper.prepare();
/*
在后台做什么
* */
项目表项目表;
试一试{
itemTable=新的itemTable(deletedItem.getItemName()、deletedItem.getItemImage()、deletedItem.getItemPrice()、mySharedPreference.getrdRestaurantName());
}捕获(NumberFormatException ex){
itemTable=新的itemTable(deletedItem.getItemName(),deletedItem.getItemImage(),0,mySharedPreference.getrdRestaurantName());
}
Long-aLong=restaurantDatabase.getItemDao().insertItemTable(itemTable);
最终手柄
public class ItemListAdapter extends RecyclerView.Adapter<ItemListAdapter.MyViewHolder> implements Filterable {
List<ItemTable> itemTableList;
List<ItemTable> filterableItemList;
OnItemEditOrDeleteListener onItemEditOrDeleteListener;
Context context;
Random random;
String[] colour;
public interface OnItemEditOrDeleteListener {
void onItemClicked(int position);
}
public ItemListAdapter(Context context, List<ItemTable> itemTableList, OnItemEditOrDeleteListener onItemEditOrDeleteListener) {
colour = new String[]{"#F8E096", "#F8D9D7", "#FDE1E1", "#FDE4C0", "#FAD9CE", "#F6B1C9", "#E8FAD3", "#E3FBF9", "#F4DEF8", "#D9EDFD", "#D2D7F4", "#E6E5E5"};
random = new Random();
filterableItemList = itemTableList;
this.context = context;
this.onItemEditOrDeleteListener = onItemEditOrDeleteListener;
this.itemTableList = itemTableList;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charsequence = charSequence.toString();
if (charsequence.isEmpty()) {
filterableItemList = itemTableList;
} else {
List<ItemTable> menuListModels = new ArrayList<>();
for (ItemTable row : itemTableList) {
if (row.getItemName().toLowerCase().contains(charsequence.toLowerCase())) {
menuListModels.add(row);
}
}
filterableItemList = menuListModels;
}
FilterResults filterResults = new FilterResults();
filterResults.values = filterableItemList;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
filterableItemList = (ArrayList<ItemTable>) filterResults.values;
notifyDataSetChanged();
}
};
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.menu_item_inflater, parent, false);
return new MyViewHolder(itemView);
}
public class MyViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.tvMenuName)
TextView tvMenuName;
@BindView(R.id.tvMenuPrice)
TextView tvMenuPrice;
@BindView(R.id.ivMenuImage)
CircleImageView ivMenuImage;
@BindView(R.id.cvMenu)
CardView cvMenu;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this,itemView);
}
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
ItemTable data = filterableItemList.get(holder.getAdapterPosition());
holder.tvMenuName.setText("" + data.getItemName());
holder.tvMenuPrice.setText("€ " + data.getItemPrice());
if (data.getItemImage() != null) {
Glide.with(context)
.load(data.getItemImage())
.centerCrop()
.into(holder.ivMenuImage);
} else {
Glide.with(context)
.load(R.drawable.background)
.centerCrop()
.into(holder.ivMenuImage);
}
holder.cvMenu.setOnClickListener(view -> onItemEditOrDeleteListener.onItemClicked(holder.getAdapterPosition()));
holder.cvMenu.setCardBackgroundColor(Color.parseColor(colour[random.nextInt(colour.length - 1)]));
}
@Override
public int getItemCount() {
return filterableItemList.size();
}
}
itemListAdapter = new ItemListAdapter(getContext(), itemTableList, position -> {
ItemTable itemTable = itemTableList.get(position); //<<<< The error is here
});
public List<ItemTable> getFilteredList() {
return filterableItemList;
}
ItemTable itemTable = itemTableList.get(position);
ItemTable itemTable = itemListAdapter.getFilteredList().get(position);