android - 使用 EditText 搜索时,如果我搜索速度很快,Recyclerview 中的项目会重复

标签 android android-edittext duplicates android-recyclerview

在我的项目中,需要使用关键字从服务器中搜索数据。搜索后,我使用 RecyclerView 显示结果。在快速搜索的同时,RecyclerView 中的数据是重复的。如果搜索缓慢,它工作正常。任何建议表示赞赏。谢谢。

调用服务器的代码如下:

 private void callSearchUserApi(final String searchText, int currentPage, boolean clearData) {

    isApiCallInProcess = true;

    String URL = "userinfo/api/v1/user-search/" + "?page=" + currentPage;

    if (!Connectivity.isConnected(activity)) {
        Common.snackBarNoConnection(activity, activity.getString(R.string.no_conection));
        //setOnProgressbarVisibility(View.GONE);
        return;
    }

    if (clearData) {
        globalSearchUsersModelList.clear();
        //BS globalSearchUserResultsAdapter.notifyDataSetChanged();
    }
    ApiInterface apiCall = ApiClient.getApiService(activity);
    final Call<SearchUsersModel> globalUserSearchApiCall = apiCall.searchUser(
            URL,
            searchText);
    globalUserSearchApiCall.enqueue(new Callback<SearchUsersModel>() {
        @Override
        public void onResponse(Call<SearchUsersModel> call, Response<SearchUsersModel> response) {
            if (response.isSuccessful() && response.body().getStatus().equalsIgnoreCase(Common.SUCCESS_RESPONSE)) {

                //BS globalSearchUsersModelList.addAll(response.body().getData().getData());

                for (int i = 0; i < response.body().getData().getData().size(); i++) {

                    SearchUsersModel.DataBeanX.DataBean dataBean = new SearchUsersModel.DataBeanX.DataBean();
                    dataBean.setDesignation(response.body().getData().getData().get(i).getDesignation());
                    dataBean.setFull_name(response.body().getData().getData().get(i).getFull_name());
                    dataBean.setGender(response.body().getData().getData().get(i).getGender());
                    dataBean.setId(response.body().getData().getData().get(i).getId());
                    dataBean.setPlace(response.body().getData().getData().get(i).getPlace());
                    dataBean.setProfile_pic(response.body().getData().getData().get(i).getProfile_pic());

                    globalSearchUsersModelList.add(dataBean);


                    /*BS if (!globalSearchUsersModelList.contains(response.body().getData().getData().get(i)))
                        globalSearchUsersModelList.add(response.body().getData().getData().get(i));*/
                }

                CURRENT_PAGE = response.body().getData().getPage();

                isLoading = false;
                if (response.body().getData().isNext() == false)
                    isLastPage = true;
                else
                    isLastPage = false;


                if (globalSearchUsersModelList.size() == 0) {
                    rv_GlobalsearchList.setVisibility(View.GONE);
                    rl_placeholderGSPeople.setVisibility(View.VISIBLE);
                    tv_placeholderGSPeople.setText(activity.getString(R.string.no_search_found) + " " + searchText);

                } else {
                    rv_GlobalsearchList.setVisibility(View.VISIBLE);
                    rl_placeholderGSPeople.setVisibility(View.GONE);

                }

                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        globalSearchUserResultsAdapter.notifyDataSetChanged();
                    }
                });



            }

            if (searchTextsList.size() > 0) {
                String sText = searchTextsList.get(0);
                searchTextsList.remove(0);
                callSearchUserApi(sText, FIRST_PAGE, true);

            } else
                isApiCallInProcess = false;
        }

        @Override
        public void onFailure(Call<SearchUsersModel> call, Throwable t) {
            isApiCallInProcess = false;
        }
    });
}

这是我的适配器。

public class GlobalSearchUserResultsAdapter extends RecyclerView.Adapter<GlobalSearchUserResultsAdapter.SearchViewHolder> {

private Context context;
private List<SearchUsersModel.DataBeanX.DataBean> searchUserList;

public GlobalSearchUserResultsAdapter(Context context, List<SearchUsersModel.DataBeanX.DataBean> searchUserList){
    this.context = context;
    this.searchUserList = searchUserList;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
    return position;
}

@Override
public SearchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    Log.v("Search", "Adapter Activity : "+context);

    View view = LayoutInflater.from(context).inflate(R.layout.global_search_row, parent, false);
    return new GlobalSearchUserResultsAdapter.SearchViewHolder(view);
}

@Override
public void onBindViewHolder(GlobalSearchUserResultsAdapter.SearchViewHolder holder, int position) {

    if ( searchUserList.get(position).getGender().equals("M")) {
        holder.iv_userImage.setBackgroundResource(R.drawable.white_border_with_circle_appblue);
        Common.setGlideImage((GlobalSearchActivity)context,
                holder.iv_userImage,
                /*searchUsersModel*/searchUserList.get(position).getProfile_pic(),
                R.drawable.male,
                true);


    } else if (searchUserList.get(position).getGender().equals("F")) {
        holder.iv_userImage.setBackgroundResource(R.drawable.white_border_with_circle_pink);
        Common.setGlideImage((GlobalSearchActivity)context,
                holder.iv_userImage,
                searchUserList.get(position).getProfile_pic(),
                R.drawable.female,
                true);
    } else {
        Common.setGlideImage((GlobalSearchActivity)context,
                holder.iv_userImage,
                searchUserList.get(position).getProfile_pic(),
                R.drawable.deafult_profilepic,
                true);
    }

    holder.tv_userName.setText(searchUserList.get(position).getFull_name());
    holder.tv_userName.setTypeface(Common
            .getFontTypeface(context, GlobalConstants.FONT_AVENIR_MEDIUM));
    holder.tv_place.setText(searchUserList.get(position).getPlace());
    holder.tv_place.setTypeface(Common
            .getFontTypeface(context, GlobalConstants.FONT_AVENIR_MEDIUM));
    holder.designation.setText(searchUserList.get(position).getDesignation());
}



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

public class SearchViewHolder extends RecyclerView.ViewHolder{

    private ImageView iv_userImage;
    private TextView tv_userName;
    private TextView tv_place;
    private TextView designation;

    public SearchViewHolder(View itemView) {
        super(itemView);

        this.iv_userImage = (ImageView) itemView.findViewById(R.id.imageSearch);
        this.tv_userName = (TextView) itemView.findViewById(R.id.nameSearch);
        tv_userName.setTypeface(Common.getFontTypeface(context,
                GlobalConstants.FONT_AVENIR_MEDIUM));
        this.designation = (TextView) itemView.findViewById(R.id.designation);
        designation.setTypeface(Common.getFontTypeface(context,
                GlobalConstants.FONT_AVENIR_MEDIUM));
        this.tv_place = (TextView) itemView.findViewById(R.id.placeSearch);
        tv_place.setTypeface(Common.getFontTypeface(context,
                GlobalConstants.FONT_AVENIR_LIGHT));

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               context.startActivity(new Intent(context, ProfileActivity.class)//ThirdParty
                        .putExtra(GlobalConstants.KEY_THIRD_PARTY_ID, searchUserList.get(getAdapterPosition()).getId()));
            }
        });

    }
}

最佳答案

您只需在 for 循环之前清除 globalSearchUsersModelList 列表,因为 API 调用是异步的。

globalSearchUsersModelList.clear();// Important one
for (int i = 0; i < response.body().getData().getData().size(); i++) {
// do your stuff
}

关于android - 使用 EditText 搜索时,如果我搜索速度很快,Recyclerview 中的项目会重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51987214/

相关文章:

java - 袋子实现,将元素添加到袋子中,不允许重复

android中java空指针异常

android - 在日历上链接标记事件

android - 如何制作自定义的EditText工具栏?

android - 使用 onClick 按钮更改 EditText 的值?

python - 如何在两个列表中形成匹配元素的列表(包括重复项)?

eclipse - 重复 eclipse

java - 尝试获取 Activity 的 DefaultSharedPreferences 时出现 NullPointerException

android - 背景图像不适用于 Android、BB、Windows Phone

android - 如何从 EditText 设置路径资源?