![](/img/trans.png)
[英]RecyclerView search filter getting wrong position after filtering result
[英]Wrong Position after Filtering and on Click in Recyclerview
我已经在我的应用程序中实现了SearchView。 但是我面临的问题是回收者视图在过滤后返回错误的位置。 过滤后如何获得确切位置。
这是我的适配器代码:
public class UserListAdapter extends Adapter<UserListAdapter.DataObjectHolder> implements Filterable {
private static MyClickListener myClickListener;
public Activity activity;
Bitmap bitmap;
ImageView imgUserBig;
TextView txtUserName;
RelativeLayout userProfileView;
private ArrayList<DataObject> mArrayList;
private ArrayList<DataObject> mFilteredList;
public UserListAdapter(Activity a, ArrayList<DataObject> d, ImageView mImgUserBig, RelativeLayout viewLinear, TextView txtUsername) {
this.activity = a;
this.mArrayList = d;
this.mFilteredList = d;
this.imgUserBig = mImgUserBig;
this.userProfileView = viewLinear;
this.txtUserName = txtUsername;
}
public DataObjectHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new DataObjectHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.raw_user_list, parent, false));
}
public void onBindViewHolder(final DataObjectHolder holder, final int position) {
holder.txtName.setText((mFilteredList.get(position)).getmName());
holder.txtUserName.setText((mFilteredList.get(position)).getmUsername());
Glide.with(activity.getApplicationContext()).load((mFilteredList.get(position)).getmImage()).into(holder.imgUser);
Glide.with(activity).load((mFilteredList.get(position)).getmImage()).asBitmap().into(new SimpleTarget<Bitmap>(Integer.MIN_VALUE, Integer.MIN_VALUE) {
public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
bitmap = resource;
(mFilteredList.get(position)).setBitmap(bitmap);
}
});
holder.imgUser.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
if ((mFilteredList.get(position)).getBitmap() != null && imgUserBig != null) {
zoomImageFromThumb(holder.imgUser, (mFilteredList.get(position)).getBitmap(), (mFilteredList.get(position)).getmImage(), (mFilteredList.get(position)).getmUsername());
}
}
});
}
public int getItemCount() {
return mFilteredList.size();
}
public void setOnItemClickListener(MyClickListener myClickListener) {
UserListAdapter.myClickListener = myClickListener;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
mFilteredList = mArrayList;
}else {
ArrayList<DataObject> filteredList = new ArrayList<>();
for (DataObject userData : mArrayList) {
if (userData.getmUsername().toLowerCase().contains(charString) || userData.getmName().toLowerCase().contains(charString)) {
filteredList.add(userData);
}
}
mFilteredList = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mFilteredList;
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mFilteredList = (ArrayList<DataObject>) results.values;
notifyDataSetChanged();
}
};
}
public interface MyClickListener {
void onItemClick(int i, View view);
}
public Object getItem(int position) {
return mFilteredList.get(position);
}
public class DataObjectHolder extends ViewHolder implements OnClickListener {
ImageView imgUser;
TextView txtName;
TextView txtUserName;
public DataObjectHolder(View itemView) {
super(itemView);
txtName = (TextView) itemView.findViewById(R.id.txtname);
txtUserName = (TextView) itemView.findViewById(R.id.txtusername);
imgUser = (ImageView) itemView.findViewById(R.id.img_user);
itemView.setOnClickListener(this);
}
public void onClick(View v) {
UserListAdapter.myClickListener.onItemClick(getPosition(), v);
}
}}
我正在调用getPosition()方法来获取项目的位置,但是它将返回旧位置,而不是经过过滤的位置。 任何帮助将不胜感激。
在recyclerview到达末尾之前,使用此类来实现滚动侦听器。 当剩下5个项目要滚动时,它会发出通知。 请参阅下面的代码。
只需将其作为单独的类放在您的项目中
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener
{
public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName();
private int previousTotal = 0; // The total number of items in the dataset after the last load
private boolean loading = true; // True if we are still waiting for the last set of data to load.
private int visibleThreshold = 5; // The minimum amount of items to have below your current scroll position before loading more.
int firstVisibleItem, visibleItemCount, totalItemCount;
private int current_page = 0;
private StaggeredGridLayoutManager mLinearLayoutManager;
private LinearLayoutManager mLinearLayoutManagerG;
public EndlessRecyclerOnScrollListener(StaggeredGridLayoutManager linearLayoutManager)
{
this.mLinearLayoutManager = linearLayoutManager;
}
public EndlessRecyclerOnScrollListener(LinearLayoutManager linearLayoutManager)
{
this.mLinearLayoutManagerG = linearLayoutManager;
mLinearLayoutManager = null;
}
public void reset()
{
current_page = 0;
previousTotal = 0;
loading = true;
}
public void setThresHold(int threshold)
{
visibleThreshold = threshold;
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy)
{
super.onScrolled(recyclerView, dx, dy);
if (mLinearLayoutManager != null)
{
visibleItemCount = recyclerView.getChildCount();
totalItemCount = mLinearLayoutManager.getItemCount();
firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPositions(null)[0];
if (loading)
{
if (totalItemCount > previousTotal)
{
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold))
{
// End has been reached
// Do something
current_page++;
onLoadMore(current_page);
loading = true;
}
}
else
{
visibleItemCount = recyclerView.getChildCount();
totalItemCount = mLinearLayoutManagerG.getItemCount();
firstVisibleItem = mLinearLayoutManagerG.findFirstVisibleItemPosition();
if (loading)
{
if (totalItemCount > previousTotal)
{
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold))
{
// End has been reached
// Do something
current_page++;
onLoadMore(current_page);
loading = true;
}
}
countChange(firstVisibleItem);
}
public abstract void onLoadMore(int current_page);
public abstract void countChange(int currentVisibleCount);
}
这样使用
endlessRecyclerOnScrollListener = new EndlessRecyclerOnScrollListener(pass your layout manager here)
{
@Override
public void onLoadMore(int current_page) {
pageNumber++;
// Hit your api for more records
}
@Override
public void countChange(int currentVisibleCount) {
}
};
recyclerView.setOnScrollListener(endlessRecyclerOnScrollListener);
有一个名为current_page
的变量,默认情况下它从0开始,您可以根据自己的api进行更改。 visibleThreshold
表示应在调用多少个onLoadMore
方法之前。
示例:如果visibleThreshold
为5,列表中的总数据为20,那么当将recyclerview滚动到第15位时,将调用onLoadMore
。
让我知道您是否还有其他疑问。
在您的onClick方法中使用getAdapterPosition(),因为在单击时,您想知道项目的位置。 如果您在创建时检查,(大多数情况下)将不准确
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.