Recyclerview показывает данные снова и снова, когда вызывается функция несколько раз в базе данных - PullRequest
0 голосов
/ 17 марта 2020

В последнее время я работаю над android проектом с FireBase, я использую Recycleler для отображения данных. Я добавил текст редактирования и кнопку поиска, когда мы нажимаем кнопку поиска одним вызовом функции и показываем его поиск соответствующих данных. Но проблема в том, что когда я нажимаю кнопку поиска, она отображает данные (предположим, что найден только 1 результат), когда я нажимаю кнопку поиска снова, она снова добавляет те же данные, и снова и снова отображается снова, когда я нажимаю кнопку.

Я действительно волнуюсь, пожалуйста, предложите мне, в чем проблема.

Код моего адаптера


import android.app.LauncherActivity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;

public class Find_donor_Adapter extends RecyclerView.Adapter<Find_donor_Adapter.MyViewHolder> {

    Context context;
    ArrayList<find_donor_helper> find_donor_helper;

    public Find_donor_Adapter(Context context, ArrayList<find_donor_helper> find_donor_helper) {
        this.context = context;
        this.find_donor_helper = find_donor_helper;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.find_blood_layout,parent,false));
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

        final find_donor_helper helper = find_donor_helper.get(position);
        holder.lname.setText(find_donor_helper.get(position).getFullname());
        holder.bldgrp.setText(find_donor_helper.get(position).getBloodgroup());

        final String n = helper.getPhonenumber();
        holder.lnumber.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try
                {
                    Intent call = new Intent(Intent.ACTION_CALL);
                    call.setData(Uri.parse("tel:03465987599"));
                    call.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(call);
                }
                catch (Exception e)
                {
                    Toast.makeText(context, ""+e.getMessage(), Toast.LENGTH_LONG).show();
                }
            }
        });

        holder.ucall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent call = new Intent(Intent.ACTION_VIEW);
                call.setData(Uri.parse("sms:"+n));
                call.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(call);
            }
        });



        Picasso.get().load(helper.getUserimg()).into(holder.uimg);
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder{

        TextView lname,bldgrp;
        Button lnumber,ucall;
        ImageView uimg;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            lname = (TextView) itemView.findViewById(R.id.name);
            bldgrp = (TextView) itemView.findViewById(R.id.bloodgroup);
            lnumber = (Button) itemView.findViewById(R.id.number);
            uimg = (ImageView) itemView.findViewById(R.id.userimg);
            ucall = (Button) itemView.findViewById(R.id.call);
        }
    }
}

основной код


import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Toast;

import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;

public class Find_BloodDonator extends AppCompatActivity {

    RecyclerView findblood;
    ArrayList<find_donor_helper> arrayList;
    Find_donor_Adapter adapter;
    ProgressDialog pd;

    EditText searchtext;
    String st;
    DatabaseReference reference;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_find__blood_donator);

        pd = new ProgressDialog(this);
        pd.setMessage("Please wait...");
        pd.setCanceledOnTouchOutside(false);
        pd.setCancelable(false);


        findblood = findViewById(R.id.findblood);

        findblood.setLayoutManager(new LinearLayoutManager(this));

        arrayList = new ArrayList<find_donor_helper>();

        //alldata("blooddonor","Yes");


        searchtext = findViewById(R.id.searchtext);
        st = searchtext.getText().toString();

        searchtext.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                alldata("bloodgroup","hello");
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                alldata("bloodgroup","hello");
            }

            @Override
            public void afterTextChanged(Editable s) {
                alldata("bloodgroup",s.toString());
            }
        });


    }

    private void alldata(String blooddonor,String bloodgroup) {

        reference = FirebaseDatabase.getInstance().getReference().child("Users");

        Query chk = reference.limitToLast(10).orderByChild(blooddonor).equalTo(bloodgroup);

        chk.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                pd.cancel();

                try {
                    for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren())
                    {
                        find_donor_helper donor_helper = dataSnapshot1.getValue(find_donor_helper.class);
                        arrayList.add(donor_helper);
                    }
                    adapter = new Find_donor_Adapter(getApplicationContext(),arrayList);
                    findblood.setAdapter(adapter);
                }
                catch (Exception e)
                {
                    pd.cancel();
                    Toast.makeText(Find_BloodDonator.this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                pd.cancel();
                Toast.makeText(Find_BloodDonator.this, "Server error", Toast.LENGTH_SHORT).show();
            }
        });
    }

}

1 Ответ

1 голос
/ 17 марта 2020

Когда вы делаете новый поиск, ваш onDataChange вызывается со всеми результатами поиска. Затем вы в настоящее время добавляете эти результаты поиска в arrayList, что означает, что при выполнении дополнительных поисков список просто становится длиннее.

Чтобы отображать только результаты последнего запроса, необходимо очистить arrayList перед добавлением в него новых результатов поиска:

Query chk = reference.limitToLast(10).orderByChild(blooddonor).equalTo(bloodgroup);

chk.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        pd.cancel();
        arrayList.clear()
        try {
            for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren()) {
                find_donor_helper donor_helper = dataSnapshot1.getValue(find_donor_helper.class);
                arrayList.add(donor_helper);
            }
            adapter = new Find_donor_Adapter(getApplicationContext(),arrayList);
            findblood.setAdapter(adapter);
        }
        catch (Exception e) {
            pd.cancel();
            Toast.makeText(Find_BloodDonator.this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
        }

    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        pd.cancel();
        Toast.makeText(Find_BloodDonator.this, "Server error", Toast.LENGTH_SHORT).show();
    }
});

Обратите внимание, что вам не нужно создавать новый адаптер каждый раз, когда вы вносите изменения arrayList. Вы также можете изменить arrayList, чтобы он содержал обновленные элементы (как вы уже это сделали), а затем просто указать существующему адаптеру обновить sh его представления с обновленными данными.

Это означает, что вы можете переместить создание адаптера в onCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_find__blood_donator);

    ...

    arrayList = new ArrayList<find_donor_helper>();

    adapter = new Find_donor_Adapter(getApplicationContext(),arrayList);
    findblood.setAdapter(adapter);

, а затем обновить sh данные:

Query chk = reference.limitToLast(10).orderByChild(blooddonor).equalTo(bloodgroup);

chk.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        pd.cancel();
        arrayList.clear()
        try {
            for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren()) {
                find_donor_helper donor_helper = dataSnapshot1.getValue(find_donor_helper.class);
                arrayList.add(donor_helper);
            }
            adapter.notifyDataSetChanged();
        }
        catch (Exception e) {
            pd.cancel();
            Toast.makeText(Find_BloodDonator.this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        pd.cancel();
        Toast.makeText(Find_BloodDonator.this, "Server error", Toast.LENGTH_SHORT).show();
    }
});
...