Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java recyclerview在使用搜索筛选列表后打开错误的项目_Java_Android_Android Recyclerview_Android Adapter - Fatal编程技术网

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);