Перезаполнение различных данных в RecyclerView на основе нажатия кнопки - PullRequest
0 голосов
/ 10 июля 2019

У меня есть 2 кнопки publicReport и myReport, и если я нажму на общедоступные отчеты, он получит все данные из моей базы данных, где, как если бы я нажал на myReport, он получил бы данные только на основе текущего имени пользователя. В настоящее время я добиваюсь этого благодаря наличию двух фрагментов и отображению двух видов переработчика, которые, на мой взгляд, не очень подходят. Есть ли какой-нибудь способ, возможно, в адаптере, где я могу заполнить различные данные в зависимости от нажатия кнопки? Здесь - ссылка на мой предыдущий пост, где я применил фрагменты для дела

Вот некоторые из кодов

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private ReportAdapter mAdapter;
    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private CollectionReference collectionReference = db.collection("Report");
    private List<Report> mReport;
    private Button publicReport,myReport;

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

        publicReport = findViewById(R.id.publicReport);
        myReport = findViewById(R.id.myReport);


        mRecyclerView = findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        mReport = new ArrayList<>();

        myReport.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                collectionReference.orderBy("date", Query.Direction.DESCENDING).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                        for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
                            Report report = documentSnapshot.toObject(Report.class);
                            mReport.add(report);
                        }

                        mAdapter = new ReportAdapter(getApplicationContext(),mReport);

                        mRecyclerView.setAdapter(mAdapter);
                    }
                });


            }
        });

        publicReport.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //TODO: POPULATE ALL REPORT DATA
            }
        });
    }
}

ReportAdapter

public class ReportAdapter extends RecyclerView.Adapter<ReportAdapter.ReportHolder> {

    private Context mContext;
    private List<Report> mReports;

    public ReportAdapter(Context context, List<Report> reports){
        mContext = context;
        mReports = reports;
    }

    public void onRefreshAdapter(List<Report> reports){
        mReports = reports;
        notifyDataSetChanged();
    }

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

    @Override
    public void onBindViewHolder(@NonNull ReportHolder holder, int position) {
        String seriousLvl = "";

        Report report = mReports.get(position);
        holder.txtTitle.setText(report.getReportType());
        holder.txtDescription.setText(report.getDescription());
        holder.txtDate.setText(report.getDate());
        holder.txtReportedBy.setText(report.getReportedBy());

        seriousLvl = report.getSeriousness();

        if (seriousLvl.equals("Low")) {
            holder.seriousness.setBackgroundColor(Color.argb(100, 0, 255, 11));
        } else if (seriousLvl.equals("Medium")) {
            holder.seriousness.setBackgroundColor(Color.argb(100, 255, 220, 0));
        } else if (seriousLvl.equals("High")) {
            holder.seriousness.setBackgroundColor(Color.argb(100, 255, 0, 0));
        } else {
            Log.d("ERROR", "NEITHER: ");
        }
    }


    @Override
    public int getItemCount() {
        return 0;
    }

    public class ReportHolder extends RecyclerView.ViewHolder{

        TextView txtTitle, txtDescription, txtDate, txtReportedBy;
        CardView seriousness;

        public ReportHolder(@NonNull View itemView) {
            super(itemView);
            seriousness = itemView.findViewById(R.id.seriousness);
            txtTitle = itemView.findViewById(R.id.text_view_title);
            txtDescription = itemView.findViewById(R.id.text_view_description);
            txtDate = itemView.findViewById(R.id.text_view_date);
            txtReportedBy = itemView.findViewById(R.id.text_view_report_by);

        }
    }
}

Ответы [ 3 ]

0 голосов
/ 10 июля 2019

Решено

Как уже упоминалось @Murali Krishnan, мне пришлось добавить метод onRefreshAdapter в моем адаптере отчетов, и когда я включал функцию щелчка, я сначала очищал ArrayList, а затем читалс новыми данными.

MainActivity.java

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

    publicReport = findViewById(R.id.publicReport);
    myReport = findViewById(R.id.myReport);
    mRecyclerView = findViewById(R.id.recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mReport = new ArrayList<>();

    myReport.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            collectionReference.orderBy("date", Query.Direction.DESCENDING).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                    for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
                        Report report = documentSnapshot.toObject(Report.class);

                        mReport.clear();
                        mReport.add(report);

                    }

                    mAdapter = new ReportAdapter(MainActivity.this, mReport);
                    mAdapter.onRefreshAdapter(mReport);
                    mRecyclerView.setAdapter(mAdapter);
                }
            });

        }
    });

    publicReport.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            collectionReference.whereEqualTo("reportedByUserID","K2TPzSkIjvXCI2m1QGhyYr7qWpw1").orderBy("date", Query.Direction.DESCENDING).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                    for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
                        Report report = documentSnapshot.toObject(Report.class);
                        mReport.clear();
                        mReport.add(report);

                    }

                    mAdapter = new ReportAdapter(MainActivity.this, mReport);
                    mAdapter.onRefreshAdapter(mReport);
                    mRecyclerView.setAdapter(mAdapter);
                }
            });
        }
    });
}

ReportAdapter

public void onRefreshAdapter(List<Report> reports){
    mReports = reports;
    notifyDataSetChanged();
}
0 голосов
/ 11 июля 2019

Самый простой способ - загрузить оба списка данных в отдельном списке при запуске фрагмента и установить список по умолчанию для адаптера просмотра повторной установки.

, когда пользователь нажимает кнопку, пытаясь изменить набор данных адаптера RecyclerView с помощьюдобавляя новую функцию,

public changeDateSet(ArrayList<Objects> aDataList){
     mCurrentDataList = aDataList;
     notifyDataSetChanged();
}

При каждом нажатии кнопки Вы вызываете эту функцию с предварительно загруженными наборами данных, чтобы она обновляла графический интерфейс.

Важно: После изменения набора данныхадаптер, который вы должны сделать notifyDataSetChanged ();в противном случае переработчик не будет обновлять графический интерфейс.

0 голосов
/ 10 июля 2019

Да, вы можете

  1. Сохранять ваши данные в ArrayList
  2. Создать метод в адаптере утилита просмотра как этот
public void onRefreshAdapter(ArrayList<GetterSetterClass> yourList) {
                       global arraylist in adapter= yourList ;
                notifyDataSetChanged();

            }

Call onRefreshAdapter() in your button click


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