Отображение тоста из неактивного класса

#java #android #android-toast

#java #Android #android-toast

Вопрос:

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

Что я могу сделать для достижения этого?

Я хочу задать тосты в onLoadingStateChanged() операторах switch.

Я пробовал некоторые старые коды, но они, похоже, не работают.

Я не хочу, RecylerView чтобы адаптер находился в MainActivity

Моя активность адаптера:

 public class TalesAdapter extends FirestorePagingAdapter<TalesDetails, TalesAdapter.TalesViewHolder> {

    public TalesAdapter(@NonNull FirestorePagingOptions<TalesDetails> options) {
        super(options);
    }



    @Override
    protected void onBindViewHolder(@NonNull TalesViewHolder holder, int position, @NonNull TalesDetails model) {
        holder.bind(model);

    }

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

    @Override

    protected void onLoadingStateChanged(@NonNull LoadingState state) {
        switch (state) {
            case LOADING_INITIAL:
            case LOADING_MORE:
             //toast here
                break;

            case LOADED:
             //toast here
            case FINISHED:
             //toast here
                break;

            case ERROR:
             //toast here

                break;
        }

    }

    public class TalesViewHolder extends RecyclerView.ViewHolder  {

        private TextView Title;
        private TextView Matter;
        private TextView Name;

        public TalesViewHolder(View itemView ) {
            super(itemView);
            Name = itemView.findViewById(R.id.tvName);
            Title = itemView.findViewById(R.id.tvTitle);
            Matter = itemView.findViewById(R.id.tvMatter);
        }

        public void bind(TalesDetails tales){
            Name.setText(tales.name);
            Title.setText(tales.title);
            Matter.setText(tales.matter);

        }
    }
}
  

Ответ №1:

У вас есть две возможности :

1 — Создать Context переменную

 private Context context;

public TalesViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        context = parent.getContext();

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.talesrecyclerview, parent, false);
        return new TalesViewHolder(view);
    }
  

2 — Использование implementation 'com.blankj:utilcodex:1.29.0'

 ToastUtils.showShort("YOUR TEXT HERE");
  

Ответ №2:

Объявите тип переменной вашего класса Activity и передайте ссылку на activity ко времени построения TalesAdapter

 public class TalesAdapter extends FirestorePagingAdapter<TalesDetails, TalesAdapter.TalesViewHolder> {
Context mContext = null;

    public TalesAdapter(@NonNull FirestorePagingOptions<TalesDetails> options, Context mContext) {
        this.mContext = mContext;
        super(options);
    }
@Override

    protected void onLoadingStateChanged(@NonNull LoadingState state) {
        switch (state) {
            case LOADING_INITIAL:
            case LOADING_MORE:
             Toast.makeText(mContext, "your message", Toast.LENGTH_SHORT).show()
                break;

            case LOADED:
             //toast here
            case FINISHED:
             //toast here
                break;

            case ERROR:
             //toast here

                break;
        }

    }



}
  

Ответ №3:

Вы можете создать конструктор в адаптере, подобный:

 Context mContext;

public TalesAdapter(@NonNull FirestorePagingOptions<TalesDetails> options, Context mContext) {
        this.mContext = mContext;
        super(options);
    }



@Override   
    protected void onLoadingStateChanged(@NonNull LoadingState state) {
        switch (state) {
            case LOADING_INITIAL:
            case LOADING_MORE:
             Toast.makeText(mContext, "Taost", Toast.LENGTH_SHORT).show();
                break;
            case LOADED:
             Toast.makeText(mContext, "Taost", Toast.LENGTH_SHORT).show();
              break;
            case FINISHED:
             Toast.makeText(mContext, "Taost", Toast.LENGTH_SHORT).show();
                break;
            case ERROR:
             Toast.makeText(mContext, "Taost", Toast.LENGTH_SHORT).show();
                break;
        }

    }
  

И в вашей активности, является ли это MainActivity.java или любым другим, пока этот адаптер находится в RecyclerView или ListView

 Context mContext = this;
adapter = new TalesAdapter(mContext);
mRecycler.setAdapter(adapter)