Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.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
Android 筛选回收器视图在刷卡时未获得正确的卡位置_Android_Android Recyclerview_Android Filterable - Fatal编程技术网

Android 筛选回收器视图在刷卡时未获得正确的卡位置

Android 筛选回收器视图在刷卡时未获得正确的卡位置,android,android-recyclerview,android-filterable,Android,Android Recyclerview,Android Filterable,所以,我有一个RecyclerView,它使用swipe关闭并实现filterable 工作原理:按预期分别刷除和过滤工作。我可以用适当的动画滑动以消除,我还可以在执行此操作时从SQLite db中删除一行。我还可以使用本机可过滤功能过滤卡 什么不起作用:当我在过滤后滑动以关闭时,位置不正确,然后正如预期的那样,相应的不正确行从我的数据库中删除 我的想法:我相信我需要在筛选过程之后/期间以某种方式更新我的Activity arrayList 我在活动中的搜索代码 //create options

所以,我有一个RecyclerView,它使用swipe关闭并实现filterable

工作原理:按预期分别刷除和过滤工作。我可以用适当的动画滑动以消除,我还可以在执行此操作时从SQLite db中删除一行。我还可以使用本机可过滤功能过滤卡

什么不起作用:当我在过滤后滑动以关闭时,位置不正确,然后正如预期的那样,相应的不正确行从我的数据库中删除

我的想法:我相信我需要在筛选过程之后/期间以某种方式更新我的Activity arrayList

我在活动中的搜索代码

//create options menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_jar_options, menu);
    /*return super.onCreateOptionsMenu(menu);*/

    action_search = menu.findItem(R.id.menu_jar_action_search);
    SearchView searchView = (SearchView) action_search.getActionView();
    searchView.setBackgroundColor(0xffffffff);
    search(searchView);
    return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    return super.onOptionsItemSelected(item);
}

//search
private void search(SearchView searchView) {
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }
        @Override
        public boolean onQueryTextChange(String newText) {
            adapter.getFilter().filter(newText.toLowerCase());
            return true;
        }
    });
}
为了清晰起见,我在活动中的刷卡代码已清除

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction){
            if (direction ==ItemTouchHelper.RIGHT){
                //swipe right - delete card
                final int position = viewHolder.getAdapterPosition();
                //get necessary data from item
                s_deleteIdentifier = arrayList.get(position).getIdentifier();
                s_deleteIdentifier = (!FormatHelper.isStringEmpty(s_deleteIdentifier)) ? s_deleteIdentifier : "";
                s_deleteName = arrayList.get(position).getName();
                s_deleteName = (!FormatHelper.isStringEmpty(s_deleteName)) ? s_deleteName : "";

                //REMOVE ME after testing
                Toast.makeText(JarActivity.this, "" +position +" " +s_deleteName, Toast.LENGTH_SHORT).show();

                adapter.notifyItemRemoved(position);
                arrayList.remove(position);

                //user confirms delete, so delete row from db
                DatabaseHelper.getInstance(JarActivity.this).deleteRow(
                                    "table",
                                    "IDENTIFIER = ?",
                                    new String[] {s_deleteIdentifier}
                );
        }
适配器中的我的筛选代码

@Override
public Filter getFilter(){
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence){
            String charString;

            if (charSequence != null) charString = charSequence.toString();
            else charString = "";

            if (charString.isEmpty()){
                arrayListFiltered = arrayList;
            }else{
                ArrayList<JarObject> filteredList = new ArrayList<>();
                for (JarObject jarObject : arrayList) {
                    if (jarObject.getName().toLowerCase().contains(charString) ||
                            jarObject.getLocation().toLowerCase().contains(charString) ||
                            jarObject.getUserNote().toLowerCase().contains(charString) ||
                            jarObject.getSummary().toLowerCase().contains(charString)
                            )
                        filteredList.add(jarObject);
                }
                arrayListFiltered = filteredList;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = arrayListFiltered;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            arrayListFiltered = (ArrayList<JarObject>) filterResults.values;
            notifyDataSetChanged();
        }
    };
}

原始列表和筛选列表中的项目将不在相同的位置。我现在没有能力给出一个示例,但是您应该能够重写adapters getItemId方法以返回有意义的内容,并使用ViewHolder.getItemId来获取要删除的实际项目,而不是依赖于位置


您还可以公开筛选列表,以便从活动中访问该列表,根据位置从筛选列表中获取项目,然后搜索原始列表以获得正确的位置。

我正在尝试使用getItemId,它每次返回-1。我不知道那告诉我什么。我现在正在寻找答案。您是否覆盖适配器中的getItemId?是的,我相信是这样@重写Adapter中的公共长getItemId位置{return position;},我认为您还需要使用whew。我的代码不喜欢:。我一刷卡,它就在运行时崩溃了。也许我的其余代码都经过了调整,以便使用getAdapterPosition。不确定。