使用EditText进行搜索时,如果我正在快速搜索,则Recyclerview中的项目正在复制

时间:2018-08-23 13:40:20

标签: android android-recyclerview android-edittext duplicates recycler-adapter

在我的项目中,需要使用关键字从服务器搜索数据。搜索后,我正在使用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()));
            }
        });

    }
}

}

2 个答案:

答案 0 :(得分:0)

由于API调用是异步的,您只需要在for循环之前清除globalSearchUsersModelList列表即可。

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

答案 1 :(得分:0)

我认为问题出在您的getItemId实现上。在实现它的方式中,回收者视图将根据项目在列表中的位置来标识该项目。

如果您更改此设置并为实例Windows("Log 2018").Active Sheets("Log 2018").Range("C6").End(xlDown).Offset(1,-1).Select Application.CutCopyMode = False Selection.Copy Windows("Order Sheet.xls".Active Sheets("Order Input").Range("E4".Cells.PastgeSpecial xlAll Application.CutCopyMode = False 使用唯一标识(如果您的User对象具有唯一ID),则该问题应得到解决

您还可以添加您的活动searchUserList.get(position).id