【问题标题】:Updating RecyclerView when activity resumes?活动恢复时更新 RecyclerView?
【发布时间】:2016-11-06 01:50:35
【问题描述】:

我有一个QuestionActivity,如果我在RecyclerView 中显示问题列表。

我在工具栏中有两个动作

  1. 转到下载的文件活动。

  2. 转到最喜欢的活动。

一切正常,但是当我点击其中一个操作并返回 QuestionActivity 时,RecyclerView 无法更新。

所以我需要重写OnResume 方法。我的问题是,如何在onResume 方法中更新RecyclerView

AdapterRecyclerQuestion代码:

public class AdapterRecyclerQuestion extends RecyclerView.Adapter<AdapterRecyclerQuestion.ViewHolder> {

    private Context context;
    private ArrayList<ModelQuestion> questionha;
    private int lastd;


    ////////////////////////////////////////////////////////////
    //================== Constructor   =========================
    ////////////////////////////////////////////////////////////

    public AdapterRecyclerQuestion(Context context, ArrayList<ModelQuestion> questionha) {
        this.context = context;
        this.questionha = questionha;
    }

    ////////////////////////////////////////////////////////////
    //================== view holder  =========================
    ////////////////////////////////////////////////////////////

    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView txtTitle;
        private TextView txtDesc;
        private TextView txtCntDown;
        private Button btnDownload;
        private ImageView imgAddFav;
        private ProgressBar prgDownload;

        ////////////////////////////////////////////////////////////
        //================== View holder constructor  ==============
        ////////////////////////////////////////////////////////////

        public ViewHolder(View itemView) {
            super(itemView);
            txtTitle = (TextView) itemView.findViewById(R.id.txt_title_question);
            txtDesc = (TextView) itemView.findViewById(R.id.txt_desc_question);
            txtCntDown = (TextView) itemView.findViewById(R.id.txt_cnt_down_question_dy);
            btnDownload = (Button) itemView.findViewById(R.id.btn_down_question);
            imgAddFav = (ImageView) itemView.findViewById(R.id.img_add_to_fav);
            prgDownload = (ProgressBar) itemView.findViewById(R.id.prgDownload);
        }
    }
    ////////////////////////////////////////////////////////////
    //================== on create view holder  ================
    ////////////////////////////////////////////////////////////

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

    ////////////////////////////////////////////////////////////
    //================== on bind view holder  =================
    ////////////////////////////////////////////////////////////

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {


        QuestionDatabaseAdapter questionDatabaseAdapter = new QuestionDatabaseAdapter(holder.itemView.getContext());

        holder.txtTitle.setText(questionha.get(position).getQuestionTitle());
        holder.txtDesc.setText(questionha.get(position).getQuestionDesc());
        holder.txtCntDown.setText(questionha.get(position).getQuestionDownCnt());

        ////////////////////////////////////////////////////////////
        //================== Favorite checking  ====================
        ////////////////////////////////////////////////////////////


        boolean isFavorite = questionDatabaseAdapter.isQuestionFavorite(questionha.get(position).getQuestionId());

        if (isFavorite)

        {
            holder.imgAddFav.setImageResource(R.drawable.ic_favorite_red_700_24dp);
        } else

        {
            holder.imgAddFav.setImageResource(R.drawable.ic_favorite_border_red_a700_24dp);
        }


        ////////////////////////////////////////////////////////////
        //================== img add fav listener  =================
        ////////////////////////////////////////////////////////////

        holder.imgAddFav.setOnClickListener(new View.OnClickListener() {

                                                @Override
                                                public void onClick(View v) {

                                                    QuestionDatabaseAdapter databaseAdapter = new QuestionDatabaseAdapter(v.getContext());
                                                    boolean isFav = databaseAdapter.isQuestionFavorite(questionha.get(position).getQuestionId());

                                                    if (!isFav) {
                                                        Toast.makeText(v.getContext(), "به لیست علاقه مندی ها اضافه شد", Toast.LENGTH_SHORT).show();
                                                        holder.imgAddFav.setImageResource(R.drawable.ic_favorite_red_700_24dp);
                                                        ModelQuestion question = new ModelQuestion();

                                                        question.setQuestionId(questionha.get(position).getQuestionId());
                                                        question.setQuestionTitle(questionha.get(position).getQuestionTitle());
                                                        question.setQuestionDesc(questionha.get(position).getQuestionDesc());
                                                        question.setQuestionDownLink(questionha.get(position).getQuestionDownLink());
                                                        question.setQuestionDownFileName(questionha.get(position).getQuestionDownFileName());

                                                        databaseAdapter.saveQuestion(question);
                                                    } else {
                                                        Toast.makeText(v.getContext(), "از لیست علاقه مندی ها پاک شد", Toast.LENGTH_SHORT).show();
                                                        holder.imgAddFav.setImageResource(R.drawable.ic_favorite_border_red_a700_24dp);
                                                        databaseAdapter.deleteQuestion(questionha.get(position).getQuestionId());
                                                    }
                                                }
                                            }
        );
    }

    ////////////////////////////////////////////////////////////
    //================== get item count method  ================
    ////////////////////////////////////////////////////////////
    @Override
    public int getItemCount() {
        if (questionha.size() == 0) {
            return 0;
        } else {
            return questionha.size();
        }
    }
}

谢谢。

【问题讨论】:

  • 欢迎来到#SO。嗯,你说的无法重启是什么意思?
  • @kiana 检查您的数组列表更改或用新数据填充它并执行 adapter.notifyDataSetChanged();
  • 您是否尝试在 onResume() 方法上设置(或重置)适配器?
  • 当您推送这些操作之一并导航到新 Activity 时,您是否终止 QuestionActivity ?
  • 感谢 Anoop,我需要检查收藏图标的状态和其他一些作品。

标签: android android-recyclerview material-design


【解决方案1】:

Loaders 最适合您希望通知所有数据库更改并反映在 UI 上的目的。

如果您正在从其他两个活动对数据库进行一些更改,并希望在 QuestionActivity 上更新 UI,只需制作一个加载程序并在 onResume() 中启动它。

通过这个链接来实现一个加载器: http://www.grokkingandroid.com/using-loaders-in-android/

【讨论】:

    【解决方案2】:

    你可以试试这个。 在适配器中为您的ArrayList&lt;ModelQuestion&gt; questionha; 创建一个设置器。

    public void setData(ArrayList<ModelQuestion> data){
        questionha=data;
        notifyDataSetChanged();
    }
    

    并在您的 onResume() 中使用新数据调用它

    如果您知道项目在哪个位置发生了变化,请记住调用notifyDataSetChanged(); 或特定的notifiyItemChangedAt(pos) 等。你可以选择——https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html

    【讨论】:

      【解决方案3】:

      感谢 Anoop M,我只是为我编写了解决方案。 我在 QuestionActivity 中写了这段代码。

          ////////////////////////////////////////////////////////////
          //================== on Resume   ===========
          ////////////////////////////////////////////////////////////
      
          @Override
          protected void onResume() {
              super.onResume();
              adapterRecyclerQuestion.notifyDataSetChanged();
              recyclerQuestion.setAdapter(adapterRecyclerQuestion);
          }
      

      【讨论】:

      • 这不是正确的方式 kiana。不要强迫适配器更新它的数据,除非你真的需要它。行动前检查。仅在项目更改时更新。您编写的代码将更新您在每份简历中的视图。比如说,如果您的应用程序从同一屏幕进入后台,那么当它进入前台时,它将更新您的视图。 tat 完全是多余的。
      • 你有什么建议?
      • 当您提供适配器时。您正在强制刷新回收站视图。因此,您需要编辑数据并通知适配器或为适配器提供服务。但不是两者都
      猜你喜欢
      • 2018-05-16
      • 2018-10-31
      • 1970-01-01
      • 2014-06-26
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多