onClickListener вызывается раньше, чем Fragment onCreateView - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть 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 уже создан в конструкторе Адаптера. Тем не менее, его onCreateView еще не был вызван при нажатии на держатель. И setImage и setRating должны изменить свои imageView и RatingBar, которые являются нулевыми, если не вызывается onCreateView фрагмента. Есть ли способ решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Более правильным способом было бы иметь метод setImage и метод setRating для проверки на ноль. Если ноль, они должны сохранить значение в переменную, и onCreate должен использовать эти значения для установки. Например (не проверено);

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

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

Таким образом, вы можете правильно использовать асинхронные диалоговые вызовы.

0 голосов
/ 05 ноября 2018

Это потому, что DialogFragment.show фиксирует асинхронно. В вашем случае вы хотите, чтобы вместо него использовался DialogFragment.showNow, поэтому он фиксируется синхронно.

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

В противном случае я бы предложил создавать новые DialogFragment при каждом нажатии кнопки и передавать URL-адрес и рейтинг изображения в качестве аргументов перед его отображением.

...