удаление строк дочерних макетов в представлении переработчика - PullRequest
0 голосов
/ 27 января 2020

В моем приложении android у меня есть вид переработчика и у меня есть панель поиска. Я получаю данные из БД. При поиске соответствующих данных из базы данных производится поиск и добавляется число строк в представлении рециркулятора в зависимости от длины выборки массива json из базы данных. Теперь проблема возникает, когда я выполняю другой поиск, строки, сгенерированные из последнего поиска, не удалили. Infect новые строки добавляются. Например, в первый раз, когда я выполнял поиск, добавляются 3 строки, потому что длина массива json равна 3. В следующий раз, когда я произвел поиск, скажем, длина массива json равна 2, тогда предыдущие 3 строки не получить удалить заражать я получаю 5 строк (предыдущий поиск 3 строки и следующий поиск 2 строки). Я хочу, чтобы при выполнении поиска строки, сгенерированные в результате предыдущего поиска, были удалены.

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")));


                                        }
                                    } 

Это код моего адаптера

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();
}

Ответы [ 3 ]

0 голосов
/ 27 января 2020
MessageItem = new ArrayList<>();

Вы должны добавить этот код перед значением l oop в вашем коде.

0 голосов
/ 27 января 2020

Вам нужно удалить добавление данных в адаптер из конструктора. Таким образом, вместо этого

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

}

Вам нужно написать собственный метод:

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

И затем, из вашего класса, вызвать этот метод как adapter.addDataToAdapter(yourList)

Конструктор для тогда ваш адаптер будет выглядеть как

public MessagesAdapter(Context context) {
    this.context = context;
    exampleListFull = new ArrayList<>();
}
0 голосов
/ 27 января 2020

В настоящее время вы не изменяете данные внутри своего адаптера, поэтому ваш список только увеличивается. Вам не нужно устанавливать адаптер на null. Вам просто нужен какой-то метод внутри адаптера, например

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

, и вызывайте его, когда вы получаете новые данные из БД

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...