[英]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.