简体   繁体   English

如何在Android RecyclerView适配器中过滤后获取原始项目位置?

[英]How to get original item position after filter in Android RecyclerView adapter?

I have implement filter in android recyclerview adapter.我在 android recyclerview 适配器中实现了过滤器。 But problem is that when I filtered item than position of item changed.但问题是,当我过滤项目时,项目的位置发生了变化。 I need the original position of the item after filter?我需要过滤后项目的原始位置? How can i get it?我怎么才能得到它?

Here is my code:这是我的代码:

public class SearchAdapter extends SelectableAdapter<SearchAdapter.ViewHolder> implements Filterable {

    static ArrayList<SingleHadishDisplayModel> singleHadishDisplayModels;
    ArrayList<SingleHadishDisplayModel> singleHadishDisplayModelsFilter;
    public ViewHolder.ClickListener clickListener;

    Context context;

    public SearchAdapter(ArrayList<SingleHadishDisplayModel> singleHadishDisplayModels) {
        this.singleHadishDisplayModelsFilter = singleHadishDisplayModels;
        if (singleHadishDisplayModels != null) {
            this.singleHadishDisplayModels = new ArrayList<>(singleHadishDisplayModels);
        } else {
            this.singleHadishDisplayModels = null;
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        context = parent.getContext();
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.search_adapter, parent, false);

        ViewHolder vh = new ViewHolder(v, clickListener);
        return vh;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        holder.topic.setText(singleHadishDisplayModelsFilter.get(position).topic);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Contants.clickPos=position;
                /*long id =  SearchAdapter.getItemId(position);
                Toast.makeText(context,Long.toString(id), Toast.LENGTH_SHORT).show();*/

                Intent intent = new Intent(context, HadishDetails.class);
                context.startActivity(intent);
            }
        });
    }

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

    public long getItemId(int position) {
        int itemID;
        // orig will be null only if we haven't filtered yet:
        if (singleHadishDisplayModels == null) {
            itemID = position;
        } else {
            itemID = singleHadishDisplayModels.indexOf(singleHadishDisplayModels.get(position));
        }
        return itemID;
    }


    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults filterResults = new FilterResults();

                if (constraint.length() == 0) {
                    filterResults.values = SearchAdapter.this.singleHadishDisplayModels;
                    return filterResults;
                }

                String searchString = constraint.toString().toLowerCase();

                List<SingleHadishDisplayModel> filteredList = new ArrayList<>();
                filterResults.values = filteredList;

                for (SingleHadishDisplayModel tableSelectionDTO : SearchAdapter.this.singleHadishDisplayModels) {
                    if (tableSelectionDTO.topic.toLowerCase().contains(searchString)) {
                        filteredList.add(tableSelectionDTO);
                    }
                }

                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                SearchAdapter.this.singleHadishDisplayModelsFilter = (ArrayList<SingleHadishDisplayModel>) results.values;
                SearchAdapter.this.notifyDataSetChanged();
            }
        };

        return filter;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
        TextView topic;

        private ClickListener listener;

        public ViewHolder(View itemView, ClickListener clickListener) {
            super(itemView);

            this.listener = clickListener;
            topic = (TextView) itemView.findViewById(R.id.topic_search);

            itemView.setOnClickListener(this);
            itemView.setOnLongClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (listener != null) {
                listener.onItemClicked(getAdapterPosition());
            }
        }

        @Override
        public boolean onLongClick(View view) {
            if (listener != null) {
                return listener.onItemLongClicked(getAdapterPosition());
            }
            return false;
        }

        public interface ClickListener {
            public void onItemClicked(int position);

            public boolean onItemLongClicked(int position);
        }

    }
}

My activity:我的活动:

public class SearchActivity extends AppCompatActivity implements SearchAdapter.ViewHolder.ClickListener {
    private RecyclerView mRecyclerView;
    public SearchAdapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    ArrayList<SingleHadishDisplayModel> singleHadishDisplayModels;
    SingleHadishDisplayModel singleHadishDisplayModel;
    int positionClick;
    public static final String POST_ID = "postID";

    FloatingSearchView floatingSearchView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        //floatingSearchView= (FloatingSearchView) findViewById(R.id.floating_search_view);
        singleHadishDisplayModels = new ArrayList<SingleHadishDisplayModel>();
        singleHadishDisplayModels = Contants.singleHadishDisplayModelsSaved;

        mRecyclerView = (RecyclerView) findViewById(R.id.search_reycler);
        mRecyclerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        mAdapter = new SearchAdapter(singleHadishDisplayModels);
        mRecyclerView.setAdapter(mAdapter);


        /*  floatingSearchView.setOnQueryChangeListener(new FloatingSearchView.OnQueryChangeListener() {
        @Override
        public void onSearchTextChanged(String oldQuery, final String newQuery) {
        mAdapter.clearSelection();
        mAdapter.getFilter().filter(newQuery);
    }
});*/

        EditText et = (EditText) findViewById(R.id.search_et);
        et.addTextChangedListener(new TextWatcher() {

            public void onTextChanged(CharSequence cs, int arg1, int arg2,
                                      int arg3) {
                // When user changed the Text
                SearchActivity.this.mAdapter.getFilter().filter(cs);
                Toast.makeText(SearchActivity.this, Integer.toString(arg1), Toast.LENGTH_SHORT).show();
            }

            public void beforeTextChanged(CharSequence arg0, int arg1,
                                          int arg2, int arg3) {
                // TODO Auto-generated method stub

            }

            public void afterTextChange(Editable arg0) {
                // TODO Auto-generated method stub

            }

            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub

            }
        });


    }


    @Override
    public void onItemClicked(int position) {
        positionClick = position;


        // Intent intent =new Intent(SearchActivity.this,HadishDetails.class);
        //startActivity(intent);

        //  Contants.clickPos=position;

    }

    @Override
    public boolean onItemLongClicked(int position) {
        return false;
    }
}

Use This Codes :使用此代码:

int pos = list.indexOf(arraylist1.get(getAdapterPosition()));

Here list is the original list and arrayList is filtered items list.这里list是原始列表, arrayList是过滤项目列表。

Try this code.. make interface into adapter for handling click event like this way..试试这个代码..使接口变成适配器,以这样的方式处理点击事件..

    OnItemClick onItemClick;

public void setOnItemClick(OnItemClick onItemClick) {
    this.onItemClick = onItemClick;
}

public interface OnItemClick {
    void getPosition(String data); //pass any data to shared it.
}

bindview method changes.. bindview 方法更改..

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    holder.topic.setText(singleHadishDisplayModelsFilter.get(position).topic);
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // Contants.clickPos=position;
            /*long id =  SearchAdapter.getItemId(position);
            Toast.makeText(context,Long.toString(id), Toast.LENGTH_SHORT).show();*/
            onItemClick.getPosition("your data");
           // Intent intent = new Intent(context, HadishDetails.class);
           // context.startActivity(intent);
        }
       });
       }

after adapter bind into recycler view call below code..适配器绑定到回收器视图后调用下面的代码..

        adpater.setOnItemClick(new RecyclerViewAdpater.OnItemClick() {
        @Override
        public void getPosition(String data) {
            // hear update your value for check into if condition.
            Intent intent = new Intent(context, HadishDetails.class);
            context.startActivity(intent);
            adpater.notifyDataSetChanged();
        }
    });

old position :旧位置:

 @Override
    public long getItemId(int position) {

        int itemID;
     
        // mOriginalValues will be null only if we haven't filtered yet:
        if (mOriginalValues == null)
        {
            itemID = position;
        
        }
        else
        {
            itemID = mOriginalValues.indexOf(mObjects.get(position));
           
        }
        return itemID;
     
    }

Here, mOriginalValues is the list after filtering, mObjects is the old list which was passed to the adapter, so when click on the list in onItemClick(AdapterView<?> adapterView, View view, int position, long l) the old position is :这里, mOriginalValues是过滤后的列表, mObjects是传递给适配器的旧列表,所以当在onItemClick(AdapterView<?> adapterView, View view, int position, long l)点击列表时,旧位置是:

int oldPositionAfterFilter = (int) mainAdapter.getItemId(position); 

so, always the real position even after filtering :因此,即使经过过滤,也始终是真实位置:

mainListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position , long l) {
                
                // always the real position even after filtering : 
                int oldPosition = (int) mainAdapter.getItemId(position); 

                String filePath = bs_filePathList.get(oldPosition);// always the original string; 
                bs_fileOptions(filePath);

            }
        });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Android:如何在应用过滤器后确定适配器中项目的*原始*位置 - Android: How to figure out the *original* position of item in Adapter after filter has been applied 如何在 RecyclerView Adapter 中获取项目的 position - How to get position of item in RecyclerView Adapter 刷新适配器后如何将 recyclerView 位置项视图重置为原始状态 - How to reset recyclerView position item views to original state after refreshing adapter Android - 如何在 Android 的回收视图中搜索过滤器后获取原始项目 position - Android - How to get the original item position after search filter in Android's Recycle View 如何从Android中的RecyclerView适配器获取项目 - How to get item from RecyclerView adapter in Android 如何在 recyclerView 中获取单击项目的适配器位置 - How can i get the adapter Position of the clicked item in recyclerView 如何在Android的RecyclerView.ViewHolder的onCreate中获取adapter position - How to get adapter position in onCreate of RecyclerView.ViewHolder in Android 删除/添加项目后如何获取android Recyclerview更新的项目位置 - How to get android Recyclerview updated item position after deletion/addition of item 如何通过微调器项 position、Android、Z93F725A074233FE1C886F448B 过滤带有 ArrayList 的 RecyclerView - How to filter RecyclerView with ArrayList by spinner item position, Android, java? 拖放 Recyclerview 项后,如何在适配器的 onbind 方法中提供列表项的更新位置 - After drag and drop Recyclerview item, how can I provide the updated Position of a list item at onbind method of an adapter
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM