我有一个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。并且setImage
和setRating
需要修改其imageView和RatingBar,除非调用该片段的onCreateView,否则它们为null。有办法解决这个问题吗?
答案 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;
}
这样,您可以正确使用异步对话框调用。