在片段onCreateView之前调用onClickListener

时间:2018-11-05 01:03:50

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

我有一个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,除非调用该片段的onCreateView,否则它们为null。有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

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

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

否则,建议您每次单击按钮时创建一个新的DialogFragment,并在显示图像URL和等级之前将其作为参数传递。

答案 1 :(得分:0)

更正确的方法是让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;
}

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