Показать отдельное представление, когда recyclerView пуст - PullRequest
0 голосов
/ 05 мая 2020

Я хотел бы показать представление, в котором нет данных, вместо пустого recyclerView. Это мой адаптер RecyclerView

public class SurveyAdapter extends RecyclerView.Adapter<SurveyAdapter.ViewHolderSurvey> {

    private ArrayList<Evaluator> mSurveyList;
    private View v;
    private OnItemClickListener mListener;

    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener) {
        mListener = listener;
    }

    public static class ViewHolderSurvey extends RecyclerView.ViewHolder {

        public ImageView surveyIcon;
        public TextView surveyTitle, surveyDesc, surveyStartDate, surveyEndDate, surveyAnonymous;
        public Button answerButton;

        public ViewHolderSurvey(@NonNull View itemView, final OnItemClickListener listener) {
            super(itemView);
            surveyIcon = itemView.findViewById(R.id.survey_anonymous_icon);
            surveyAnonymous = itemView.findViewById(R.id.survey_anonymous);
            surveyTitle = itemView.findViewById(R.id.survey_title);
            surveyDesc = itemView.findViewById(R.id.survey_desc);
            surveyStartDate = itemView.findViewById(R.id.survey_start_date_date);
            surveyEndDate = itemView.findViewById(R.id.survey_end_date_date);
            answerButton = itemView.findViewById(R.id.answer_btn_survey);

            answerButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null) {
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION) {
                            listener.onItemClick(position);
                        }
                    }
                }
            });
        }
    }

    public SurveyAdapter(ArrayList<Evaluator> surveyList) {
        mSurveyList = surveyList;

    }

    @NonNull
    @Override
    public SurveyAdapter.ViewHolderSurvey onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_survey_item, parent, false);
        return new ViewHolderSurvey(v, mListener);
    }

    @Override
    public void onBindViewHolder(@NonNull SurveyAdapter.ViewHolderSurvey holder, int position) {
        Evaluator currentItem = mSurveyList.get(position);

        if (!mSurveyList.isEmpty()) {
            Evaluation eval = currentItem.getEvaluation();
            Survey survey = eval.getSurvey();

            holder.surveyTitle.setText(survey.getName());
            holder.surveyDesc.setText(Html.fromHtml(survey.getDescription(), Html.FROM_HTML_MODE_COMPACT));
            holder.surveyStartDate.setText(eval.getInitDate());
            holder.surveyEndDate.setText(eval.getEndDate());

            if (survey.getAnonymous() == 0) {
                holder.surveyIcon.setImageResource(R.drawable.ic_x);
                holder.surveyAnonymous.setTextColor(ContextCompat.getColor(v.getContext(), R.color.red));
            } else {
                holder.surveyIcon.setImageResource(R.drawable.ic_check);
                holder.surveyAnonymous.setTextColor(ContextCompat.getColor(v.getContext(), R.color.green));
            }
        }

    }

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

Какой здесь лучший подход, отдельный класс ViewHolder или динамическое отображение макета. Что я могу сделать, чтобы получить это, так это работа. Прямо сейчас у меня есть LinearLayout под recyclerView, но я не уверен, как отобразить его поверх recyclerView.

Как лучше всего это сделать?

Изменить это это то, что я пробовал, в моем макете фрагментов я добавил Linear Layout с textView, в котором нет данных и значок. Это то, что я делаю во фрагменте

private LinearLayout mEmptySurveys;
private RecyclerView mRecyclerView;

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    mRecyclerView = view.findViewById(R.id.reclycer_view_surveys);
    mRecyclerView.setHasFixedSize(true); 

    mEmptySurveys = view.findViewById(R.id.survey_no_data);
    mEmptySurveys.setVisibility(View.GONE);

    swipeRefreshLayout = view.findViewById(R.id.swiperefresh_surveys);
    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
             if (Connectivity.hasConnectivity(activity, true)) {
                reloadSurveys();
            } else {
                //toast
            }
        }
    });
    if (Connectivity.hasConnectivity(activity, true)) {
        getSurveys();
    } else {
        //toast
    }

    return view;

private void reloadSurveys() {
        surveys.clear();
        getSurveys();
        swipeRefreshLayout.setRefreshing(false);
    }

private void getSurveys() {
    AlertDialog.Builder builder = new AlertDialog.Builder(activity);
    AlertDialog dialog = builder.create();
    dialog.show();

    Call<List<Evaluator>> call = apiInterface.getSurveys();

    call.enqueue(new Callback<List<Evaluator>>() {
        @Override
        public void onResponse(Call<List<Evaluator>> call, Response<List<Evaluator>> response) {
            if (!response.isSuccessful()) {
                //toast
            }

            List<Evaluator> masterItem = response.body();
            masterItem.forEach(evaluator -> {
                if (!evaluator.getAnswered()) {
                    surveys.add(new Evaluator(evaluator.getId(), evaluator.getAnswered(), evaluator.getEvaluation()));
                }
            });

            mAdapter = new SurveyAdapter(surveys);
            mRecyclerView.setAdapter(mAdapter);

            mAdapter.setOnItemClickListener(//stuff in here)


            if (surveys.isEmpty()) {
                mRecyclerView.setVisibility(View.GONE);
                mEmptySurveys.setVisibility(View.VISIBLE);
            } else {
                mRecyclerView.setVisibility(View.VISIBLE);
                mEmptySurveys.setVisibility(View.GONE);
            }

            dialog.dismiss();
        }
        @Override
        public void onFailure(Call<List<Evaluator>> call, Throwable t) {
            //toast
            dialog.dismiss();
        }
    });

Это отлично работает, когда surveys пуст, но когда я перезагружаюсь и есть данные, recyclerView пуст, полностью пуст. Как я могу это исправить?

1 Ответ

0 голосов
/ 05 мая 2020

Создайте свой макет следующим образом: TextView будет невидимым для начала, а RecyclerView не будет отображаться в любом случае, если для него не установлен адаптер.

<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/tvEmpty"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/nothing_found"
            android:visibility="invisible"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:visibility="visible" />

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Затем, когда вы устанавливаете свой адаптер на свой RecyclerView, убедитесь, что вы проверяете, что элементы, которые вы отправляете на свой адаптер, не являются пустыми или пустыми.

 private fun setAdapter(items: List<Person>? /*I am using "Person" object here*/) {
        if(items.isNullOrEmpty()) {
            //Show your TextView which represents emptiness
            tvEmpty.visible()
        } else {
            val adapter = /*instantiate your adapter here*/
            rv.layoutManager = LinearLayoutManager(requireContext())
            rv.adapter = adapter
        }
 }

Если вы используете Java:

 private void setAdapter(ArrayList<Person> items) {
        if(items.isEmpty()) {
            //Show your TextView which represents emptiness
            tvEmpty.setVisibility(View.VISIBLE);
        } else {
            MyAdapter adapter = new MyAdapter(items); /*instantiate your adapter here*/
            rv.setLayoutManager(new LinearLayoutManager(this));
            rv.setAdapter(adapter);
        }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...