【问题标题】:onClickListener is called earlier than Fragment onCreateViewonClickListener 的调用早于 Fragment onCreateView
【发布时间】:2019-04-08 09:05:22
【问题描述】:

我有一个 Recycler.Adapter,我的 onBindViewHolder 是这样的:

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
        final String url = urls.get(position);
        final width_height wh = whs.get(position);
        holder.imageView.setClickable(true);
        Picasso.with(context)
                .load(url).resize(wh.width, wh.height).centerCrop()
                .into(holder.imageView);
        holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialogFragment.show(fragmentManager, "");
                dialogFragment.setImage(url);
                dialogFragment.setRating(0);
            }
        });
        holder.textView.setText(position + "");
        holder.textView.setClickable(true);
        holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialogFragment.show(fragmentManager, "");
                dialogFragment.setImage(url);
                dialogFragment.setRating(0);
            }
        });
}

dialogFragment 已经在 Adapter 的构造器中实例化了。然而,当持有者被点击时,它的 onCreateView 还没有被调用。而setImagesetRating需要修改其imageView和RatingBar,除非调用fragment的onCreateView,否则为null。有没有办法解决这个问题?

【问题讨论】:

    标签: android android-fragments android-adapter android-button


    【解决方案1】:

    那是因为DialogFragment.show 异步提交。在您的情况下,您希望它改用 DialogFragment.showNow 以便它同步提交。

    @Override
    public void onClick(View v) {
        dialogFragment.showNow(fragmentManager, "");
        dialogFragment.setImage(url);
        dialogFragment.setRating(0);
    }
    

    否则我建议每次单击按钮时创建新的DialogFragment,并在显示之前将图像 url 和评级作为参数传递。

    【讨论】:

      【解决方案2】:

      更正确的方法是让setImage 方法和setRating 方法检查null。如果为 null,则应将值保存到变量中,并且 onCreate 应使用这些值进行设置。 例如(未测试);

      void setImage(src) {
          if (mImage == null)
              mImageSource = src;
          else
              mImage.setImage(src);
       }
      
      void onCreateView(...) {
          ...
          if (mImageSource != null)
             mImage.setImage(mImageSource);
          mImageSource = null;
      }
      

      这样您就可以正确使用异步对话框调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-09
        • 2016-12-18
        • 1970-01-01
        • 2012-02-12
        • 2013-09-06
        • 2013-06-16
        • 1970-01-01
        相关资源
        最近更新 更多