繁体   English   中英

过滤后和在Recyclerview中单击时位置错误

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM