0

In my android app, I have a recycler view and i have search bar. I am getting data from db. When i search the corresponding data from database is searched and number of rows are added in recycler view depending upon the length of json array fetch from data base. Now the problem comes when i perform another search the rows which are generated from last search didn't remove. Infect new rows are added. For example for first time when i made search then 3 rows are added because length of json array is 3. Next time when i made search, and lets say the length of json array is 2 then previous 3 rows didn't get remove infect i get 5 rows(previous search 3 rows and next search 2 rows). I want if i made a search the rows generated from previous search should be removed.

adapterise = new MessagesAdapter(MessageItem,home_Activity);

        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapterise);


try {
                                        JSONArray jsonArray = new JSONArray(output);
                                        recyclerView.removeAllViewsInLayout();
                                        recyclerView.setAdapter(null);

                                        recyclerView.setLayoutManager(layoutManager);
                                        recyclerView.setAdapter(adapterise);

                                        for (int i = 0; i < jsonArray.length(); i++) {


                                            JSONObject jsonObject = jsonArray.getJSONObject(i);//returnJson;
                                            pic=jsonObject.getString("pic");

                                            MessageItem.add(new MessageItem(pic,jsonObject.getString("name"),jsonObject.getString("email"),jsonObject.getString("mobile"),jsonObject.getString("uid")));


                                        }
                                    } 

This is my adapter code

class MessagesViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    ImageView imageView;
    ImageView imageViewc;
    ImageView imageViewm;
    TextView textView1;
    TextView textView2;
    TextView textView3;
    CardView card;
    String pos;
    boolean selected= false;
    MessagesViewHolder(View itemView) {
        super(itemView);

        imageView = itemView.findViewById(R.id.imageView);
        imageViewc = itemView.findViewById(R.id.call);
        imageViewm = itemView.findViewById(R.id.msg);
        textView1 = itemView.findViewById(R.id.placename);
        textView2 = itemView.findViewById(R.id.placedescription);
        textView3 = itemView.findViewById(R.id.placedescriptions);
        card = itemView.findViewById(R.id.card);


        imageViewc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent callIntent = new Intent(Intent.ACTION_DIAL);
                callIntent.setData(Uri.parse("tel:"+textView3.getText().toString()));
                context.startActivity(callIntent);
            }
        });

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent callIntent = new Intent(context, LoadPic.class);
                callIntent.putExtra("url",pos);
                context.startActivity(callIntent);

            }
        });

        imageViewm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Fragment fragment = new WriteMessageToUser();
                if(fragment!=null) {
                    for (Fragment fragments : ((HomeActivity)context).getSupportFragmentManager().getFragments()) {
                        ((HomeActivity)context).getSupportFragmentManager().beginTransaction().remove(fragments).commit();
                    }
                }
                FragmentTransaction transaction=((HomeActivity)context).getSupportFragmentManager().beginTransaction();
                Bundle bundle=new Bundle();
                bundle.putString("email", textView2.getText().toString());
                bundle.putString("heading",textView1.getText().toString());
                fragment.setArguments(bundle);
                transaction.replace(R.id.nav_host_fragment,fragment);
                transaction.commit();
            }
        });

        card.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {

                card.setCardBackgroundColor(ContextCompat.getColor(context,R.color.light_blue));
                selected=true;
                delete_chat.setVisibility(View.VISIBLE);
                receivers.add(card.getTag().toString());
                return true;
            }
        });
        card.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if(selected){

                    receivers.remove(card.getTag().toString());
                    card.setCardBackgroundColor(ContextCompat.getColor(context,R.color.white));
                    selected=false;

                }
                if(receivers.size()==0){
                    delete_chat.setVisibility(View.GONE);

                }
            }
        });

    }

    @Override
    public void onClick(View view) {


    }
}

public MessagesAdapter(List<MessageItem> exampleList, Context context) {
    this.exampleList = exampleList;
    this.context = context;
    exampleListFull = new ArrayList<>(exampleList);

}

@NonNull
@Override
public MessagesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_item,
            parent, false);
    return new MessagesViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull MessagesViewHolder holder, final int position) {
    MessageItem currentItem = exampleList.get(position);
    if(currentItem.getImageResource().contains("https:")){
        Glide.with(context).load(currentItem.getImageResource()).into(holder.imageView);
        Glide.with(context).load(currentItem.getImageResource()).apply(RequestOptions.circleCropTransform()).into(holder.imageView);
        holder.pos=currentItem.getImageResource();
    }else{
        Glide.with(context).load(ROOT_URL+"/"+currentItem.getImageResource()).into(holder.imageView);
        Glide.with(context).load(ROOT_URL+"/"+currentItem.getImageResource()).apply(RequestOptions.circleCropTransform()).into(holder.imageView);
        holder.pos=ROOT_URL+"/"+currentItem.getImageResource();
    }


    holder.textView1.setText(currentItem.getText1());
    holder.textView2.setText(currentItem.getText2());
    holder.textView3.setText(currentItem.getText3());
    holder.card.setTag(currentItem.gettextTag());

}

@Override
public int getItemCount() {
    return exampleList.size();
}
Umar Ghaffar
  • 101
  • 11

3 Answers3

0

Currently, you are not modifying data inside your adapter, so your list only gets bigger. You don't need to set adapter to null. You just need some kind of method inside the adapter, like

setData(List<YourData> data) {
 dataSet.clear()
 dataSet.add(data)
 notifyDataSetChanged()
}

and call it when you get new data from DB

Samir Spahic
  • 437
  • 2
  • 8
0
MessageItem = new ArrayList<>();

You should add this code before the for loop in your code.

mrtcnkryln
  • 301
  • 2
  • 14
0

You need to remove adding data to adapter from constructor. So instead of this

public MessagesAdapter(List<MessageItem> exampleList, Context context) {
    this.exampleList = exampleList;
    this.context = context;
    exampleListFull = new ArrayList<>(exampleList);

}

You need to write custom method:

public void addDataToAdapter(List<MessageItem> exampleList) {
    exampleList.clear()
    this.exampleList.addAll(exampleList)
    notifyDataSetChanged()
}

And then, from you class call this method like adapter.addDataToAdapter(yourList)

Constructor for your adapter will then be like

public MessagesAdapter(Context context) {
    this.context = context;
    exampleListFull = new ArrayList<>();
}
Samir Spahic
  • 437
  • 2
  • 8