onClickListener 比 Fragment onCreateView 更早被调用

onClickListener is called earlier than Fragment onCreateView

我有一个 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 的构造函数中实例化。但是,当单击 holder 时,它的 onCreateView 尚未被调用。而setImagesetRating需要修改其imageView和RatingBar,除非调用fragment的onCreateView,否则为null。有办法解决这个问题吗?

那是因为 DialogFragment.show 异步提交。在您的情况下,您希望它使用 DialogFragment.showNow 来代替它同步提交。

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

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

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

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

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

这样你就可以正确使用异步对话调用了。