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 尚未被调用。而setImage
和setRating
需要修改其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;
}
这样你就可以正确使用异步对话调用了。
我有一个 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 尚未被调用。而setImage
和setRating
需要修改其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;
}
这样你就可以正确使用异步对话调用了。