【问题标题】:RecyclerView getting wrong position When Apply Search with Search Filter使用搜索过滤器应用搜索时,RecyclerView 位置错误
【发布时间】:2018-01-19 07:00:10
【问题描述】:

我使用RecyclerView 并在其上实现了搜索过滤器,我在这里遇到了问题

当我按项目搜索后,我得到错误的位置不是我搜索的,请帮助我解决这个问题

例如,在搜索“android”位置后,第 2 项名称为“Android” .. 为什么会出现这个问题? ..谢谢你

MyAdapter.java

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    public List<RecyclerItem> listItems;
    private Context mContext;


    public MyAdapter(List<RecyclerItem> listItems, Context mContext) {
        this.listItems = listItems;
        this.mContext = mContext;


    }
    @Override
    public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {

        final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false);
        final ViewHolder holder = new ViewHolder(view);

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final int position = holder.getAdapterPosition();
                if (position == 0) {


                    Toast.makeText(mContext,"iOS",Toast.LENGTH_SHORT).show();

                }
                if (position == 1) {

                    Toast.makeText(mContext,"Android",Toast.LENGTH_SHORT).show();

                }

            }
        });
        return holder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {

        final RecyclerItem itemList = listItems.get(position);
        holder.txtTitle.setText(itemList.getTitle());
        holder.txtDescription.setText(itemList.getDescription());
        holder.txtOptionDigit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Display option menu
                PopupMenu popupMenu = new PopupMenu(mContext, holder.txtOptionDigit);
                popupMenu.inflate(R.menu.option_menu);
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {

                        switch (item.getItemId()) {
                            case R.id.mnu_item_save:
                                Toast.makeText(mContext, "Saved " + listItems.get(position).getTitle(), Toast.LENGTH_SHORT).show();
                                break;
                            case R.id.mnu_item_delete:
                                //Delete item
                                Toast.makeText(mContext, "Deleted " + listItems.get(position).getTitle(), Toast.LENGTH_SHORT).show();
                                listItems.remove(position);
                                notifyDataSetChanged();
                                break;
                            default:
                                break;
                        }
                        return false;
                    }
                });
                popupMenu.show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return listItems.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private  Button buttoncalling;
        public TextView txtTitle;
        public TextView txtDescription;
        public TextView txtOptionDigit;
        public ViewHolder(View itemView) {
            super(itemView);
            txtTitle = (TextView) itemView.findViewById(R.id.txtTitle);
            txtDescription = (TextView) itemView.findViewById(R.id.txtDescription);
            txtOptionDigit = (TextView) itemView.findViewById(R.id.txtOptionDigit);
            buttoncalling  = (Button) itemView.findViewById(R.id.bbbbbbbbbb);
            buttoncalling.setOnClickListener(this);


        }

        @Override
        public void onClick(View view) {

        }
    }
}

过滤器

   TextWatcher mTextWatcher = new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s.toString().equals("")){
                initAdapter();
            } else {
                searchItem(s.toString());
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    };

    private void initAdapter(){
        adapter.listItems.clear();
        for (int i = 0; i < 10; i++) {
            listItems.add(new RecyclerItem("Item " + (i + 1), "Welcome to Torisan channel, this is description of item " + (i+1)));
        }
        adapter.notifyDataSetChanged();
    }

    private void searchItem(String itemname){
        int resultCount = 0;
        adapter.listItems.clear();
        for (int i = 0; i < tempListItems.size(); i++){
            if (tempListItems.get(i).getTitle().contains(itemname)){
                listItems.add(new RecyclerItem("Item " + (i + 1), "Welcome to Torisan channel, this is description of item " + (i+1)));
                resultCount ++;
            }
        }
        if (resultCount == 0){
            showToast();
        }
        adapter.notifyDataSetChanged();
    }

    public void showToast() {
        // Set the toast and duration
        int toastDurationInMilliSeconds = 1000;
        mToastToShow = Toast.makeText(this, "No results found.", Toast.LENGTH_LONG);

        // Set the countdown to display the toast
        CountDownTimer toastCountDown;
        toastCountDown = new CountDownTimer(toastDurationInMilliSeconds, 1000 /*Tick duration*/) {
            public void onTick(long millisUntilFinished) {
                mToastToShow.show();
            }
            public void onFinish() {
                mToastToShow.cancel();
            }
        };

        // Show the toast and starts the countdown
        mToastToShow.show();
        toastCountDown.start();
    }
}

【问题讨论】:

  • 你的过滤方法在哪里?
  • 发生这种情况是因为当您过滤列表时,会创建新列表,其中“Android”项目是第一名。请分享过滤方法。以便我们可以为您提供更多帮助。谢谢
  • 它没有给你错误的位置。这是因为每次搜索后,适配器列表都会根据您的过滤器重置。
  • 请不要通过破坏您的帖子为人们增加工作量。通过在 Stack Exchange (SE) 网络上发帖,您已在 CC BY-SA 3.0 license 下授予 SE 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 SE 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。

标签: java android


【解决方案1】:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    public List<RecyclerItem> listItems;
    private Context mContext;


    public MyAdapter(List<RecyclerItem> listItems, Context mContext) {
        this.listItems = listItems;
        this.mContext = mContext;


    }
    @Override
    public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {

        final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false);
        final ViewHolder holder = new ViewHolder(view);
        view.setTag(getAdapterPosition());

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

               final int position =    Integer.parse(v.getTag().toString());
                if (position == 0) {


                    Toast.makeText(mContext,"iOS",Toast.LENGTH_SHORT).show();

                }
                if (position == 1) {

                    Toast.makeText(mContext,"Android",Toast.LENGTH_SHORT).show();

                }

            }
        });
        return holder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {

        final RecyclerItem itemList = listItems.get(position);
        holder.txtTitle.setText(itemList.getTitle());
        holder.txtDescription.setText(itemList.getDescription());
        holder.txtOptionDigit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Display option menu
                PopupMenu popupMenu = new PopupMenu(mContext, holder.txtOptionDigit);
                popupMenu.inflate(R.menu.option_menu);
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {

                        switch (item.getItemId()) {
                            case R.id.mnu_item_save:
                                Toast.makeText(mContext, "Saved " + listItems.get(position).getTitle(), Toast.LENGTH_SHORT).show();
                                break;
                            case R.id.mnu_item_delete:
                                //Delete item
                                Toast.makeText(mContext, "Deleted " + listItems.get(position).getTitle(), Toast.LENGTH_SHORT).show();
                                listItems.remove(position);
                                notifyDataSetChanged();
                                break;
                            default:
                                break;
                        }
                        return false;
                    }
                });
                popupMenu.show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return listItems.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private  Button buttoncalling;
        public TextView txtTitle;
        public TextView txtDescription;
        public TextView txtOptionDigit;
        public ViewHolder(View itemView) {
            super(itemView);
            txtTitle = (TextView) itemView.findViewById(R.id.txtTitle);
            txtDescription = (TextView) itemView.findViewById(R.id.txtDescription);
            txtOptionDigit = (TextView) itemView.findViewById(R.id.txtOptionDigit);
            buttoncalling  = (Button) itemView.findViewById(R.id.bbbbbbbbbb);
            buttoncalling.setOnClickListener(this);


        }

        @Override
        public void onClick(View view) {

        }
    }
}

【讨论】:

    【解决方案2】:

    请使用这个

    for (int i = 0; i < tempListItems.size(); i++) {
        if (listItems.get(getAdapterPosition()).getName().equals(tempListItems.get(i).getName())) {
            int selectedPos = i;  //SelectedPos is that index
            break;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-23
      • 2018-11-28
      • 2017-11-11
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      相关资源
      最近更新 更多