Prashant Luhar
Prashant Luhar

Reputation: 358

Get new position of item onClick after search via EditText in recycler view

I've a recyclerView and using editText to search the items in recyclerview. I've Click listener to get the position of whenever an item is clicked. It works perfectly fine when an item is clicked without searching. But whenever i search from edit text and click on some item it gives me incorrect position of the item.

Another issue is i've a function to close the fragment once the item is clicked from the recyclerview but somehow that function also doesn't work. :(

Code for recyclerView

    editText = rootView.findViewById(R.id.team_select_search);

    recyclerView = rootView.findViewById(R.id.team_select_recyclerView);
    recyclerView.setHasFixedSize(true);

    recyclerView.setLayoutManager(new LinearLayoutManager(this.getContext()));

    list_items = new ArrayList<>();
    teamSelectAdapter = new TeamSelectAdapter(list_items, getContext());

    recyclerView.setAdapter(teamSelectAdapter);

    loadRecyclerViewData();

    editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            filter(s.toString());
        }
    });

    teamSelectAdapter.setOnItemClickListener(new TeamSelectAdapter.ClickListener() {
        @Override
        public void onItemClick(int position, View v) {
            TeamSelectModelClass clickeditem = list_items.get(position);

            String team_id = clickeditem.getTeam_id();
            String team_name = clickeditem.getTeam_name();
            String team_logo_url = clickeditem.getTeam_logo_url();

            Toast.makeText(getContext(),team_name,Toast.LENGTH_SHORT).show();

            close_frag();
        }
    });

    return rootView;
}

private void close_frag(){

        getChildFragmentManager().beginTransaction().detach(this).commit();

}

private void filter(String text){
    ArrayList<TeamSelectModelClass> filteredList = new ArrayList<>();

    for (TeamSelectModelClass item : list_items){
        if(item.getTeam_name().toLowerCase().contains(text.toLowerCase())){
            filteredList.add(item);
        }
    }
    teamSelectAdapter.filterList(filteredList);
}

Code for recyclerview Adapter:

public class TeamSelectAdapter extends RecyclerView.Adapter<TeamSelectAdapter.ViewHolder> {

private List<TeamSelectModelClass> list_items;
private Context context;

private static ClickListener clickListener;

public interface ClickListener {
    void onItemClick(int position, View v);
}

public void setOnItemClickListener(ClickListener clickListener) {
    TeamSelectAdapter.clickListener = clickListener;
}

public void filterList(ArrayList<TeamSelectModelClass> filteredList){
    list_items = filteredList;
    notifyDataSetChanged();
}

public TeamSelectAdapter(List<TeamSelectModelClass> list_items, Context context) {
    this.context=context;
    this.list_items=list_items;

}

@NonNull
@Override
public TeamSelectAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    final View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.team_select_card_layout,viewGroup,false);

    final ViewHolder viewHolder = new ViewHolder(view);



    return viewHolder;
}

@Override
public void onBindViewHolder(@NonNull TeamSelectAdapter.ViewHolder viewHolder, int i) {
    TeamSelectModelClass teamSelectModelClass = list_items.get(i);

    viewHolder.textView_team_id.setText(teamSelectModelClass.getTeam_id());
    viewHolder.textView_team_name.setText(teamSelectModelClass.getTeam_name());
    if(teamSelectModelClass.getTeam_logo_url()!=null){
        Picasso.get().load(teamSelectModelClass.getTeam_logo_url()).into(viewHolder.imageView_team_logo);
    }else {
        Picasso.get().load(R.drawable.psa_logo).into(viewHolder.imageView_team_logo);
    }

}

public void clear(){
    list_items.clear();
    notifyDataSetChanged();
}



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

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    RelativeLayout relativeLayout_team_select_card_layout;
    TextView textView_team_id;
    TextView textView_team_name;
    ImageView imageView_team_logo;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        itemView.setOnClickListener(this);
        relativeLayout_team_select_card_layout = itemView.findViewById(R.id.team_select_card_layout);
        textView_team_id = itemView.findViewById(R.id.team_select_team_id);
        textView_team_name = itemView.findViewById(R.id.team_select_team_name);
        imageView_team_logo = itemView.findViewById(R.id.team_select_team_logo);

    }

    @Override
    public void onClick(View v) {
        clickListener.onItemClick(getLayoutPosition(), v);
    }
}
}

Upvotes: 0

Views: 904

Answers (2)

Murat G&#252;&#231;
Murat G&#252;&#231;

Reputation: 377

private void filter(String text){
    ArrayList<TeamSelectModelClass> filteredList = new ArrayList<>();

    for (TeamSelectModelClass item : list_items){
        if(item.getTeam_name().toLowerCase().contains(text.toLowerCase())){
            filteredList.add(item);
        }
    }
    teamSelectAdapter.filterList(filteredList);
    list_items.clear();
    list_items.addAll(filteredList);
}

Try this one in your activity. You are trying to toast items according to old list_items list.

Upvotes: 1

user10445557
user10445557

Reputation:

Try this........

try to get the Name of the item at the time of search and then check it from complete list like

Arraylist<String> names    //total names of items.
String serchItem           //name of item from search.

Then,....

if(names.contains(searchItem)){
    int position=names.indexOf(searchItem);
 }

if you find another way so please let me know......Thanks

Upvotes: 0

Related Questions