更改图片网址后,RecyclerView上的图片未更新

时间:2019-06-20 12:04:13

标签: java android android-recyclerview

我正在发送片段请求,以从服务器接收包含以下图片网址的存储商品数据

public class StoreFragment extends BaseFragment<FragmentStoreBinding, StoreViewModel> implements StoreNavigator {

    @Inject
    StoreViewModel viewModel;
    @Inject
    StoreAdapter storeAdapter;
    @Inject
    StoreVO storeVO;

    public static final String TAG = StoreFragment.class.getSimpleName();
    private FragmentStoreBinding binding;

    public static StoreFragment newInstance() {
        Bundle args = new Bundle();
        StoreFragment fragment = new StoreFragment();
        fragment.setArguments(args);
        return fragment;
    }

    public static StoreFragment newInstance(StoreVO storeVO) {
        Bundle args = new Bundle();
        StoreFragment fragment = new StoreFragment();
        args.putString(INTENT_EXTRA_STOREVO, new Gson().toJson(storeVO)); //put string, int, etc in bundle with a key value
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public int getBindingVariable() {
        return BR.viewModel;
    }

    @Override
    public int getLayoutId() {
        return R.layout.fragment_store;
    }

    @Override
    public StoreViewModel getViewModel() {
        return viewModel;
    }

    @Override
    public void goBack() {
        getBaseActivity().onFragmentDetached(TAG);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        viewModel.setNavigator(this);
        storeAdapter.setStoreFragment(this);
    }

    @Override
    public void onStart() {
        super.onStart();
    }

    @Override
    public void onResume(){
        super.onResume();
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        binding = getViewDataBinding();

        if (getArguments().containsKey(INTENT_EXTRA_STOREVO)) {
            storeVO = new Gson().fromJson(getArguments().getString(INTENT_EXTRA_STOREVO), StoreVO.class);
        }
        initView();
    }

    @Override
    public void onPrefClicked(String prefSn, boolean sendRequest) {
        storeVO.setPrefSn(prefSn);
        storeVO.setSearchKeyCode1(prefSn);

        switch (prefSn) {
            case EAT_PREF_SN:
                binding.eatCb.setChecked(true);
                break;
            case DRINK_PREF_SN:
                binding.drinkCb.setChecked(true);
                break;
            case PLAY_PREF_SN:
                binding.playCb.setChecked(true);
                break;
            case WATCH_PREF_SN:
                binding.watchCb.setChecked(true);
                break;
            case WALK_PREF_SN:
                binding.walkCb.setChecked(true);
                break;
            default:
                binding.allCb.setChecked(true);
        }

        if(sendRequest){
            //initStoreView();
            viewModel.requestStoreList(storeVO);
        }
    }

    private void initView() {
        binding.storeRv.setLayoutManager(new GridLayoutManager(getActivity().getApplicationContext(), 2));
        binding.storeRv.setItemAnimator(new DefaultItemAnimator());
        binding.storeRv.setAdapter(storeAdapter);
        initStoreView();
        onPrefClicked(storeVO.getPrefSn(), false);
    }

    private void initStoreView(){
        viewModel.requestStoreList(storeVO);
        subscribeStoreListLiveData();
    }

    private void subscribeStoreListLiveData() {
        viewModel.getStoreListLiveData().observe(this, storeList -> {
            viewModel.addStoreList(storeList);
            if (storeList != null) {
                binding.totalCount.setText(String.valueOf(storeList.size()));
            }
        });
    }
}

此片段的视图模型如下

public class StoreViewModel extends BaseViewModel<StoreNavigator> {

public final ObservableList<StoreVO> storeObservableList = new ObservableArrayList<>();
// MutableLiveData는 LifeCycle에 의존하여 메모리관리 등 여러 장점을 지님
private final MutableLiveData<List<StoreVO>> storeListLiveData;

public StoreViewModel(BaseApplication baseApplication) {
    super(baseApplication);
    storeListLiveData = new MutableLiveData<>();
}

public void requestStoreList(StoreVO storeVO) {
    getCompositeDisposable().add(
            getRetrofitService().selectStoreInfoList(storeVO)
                    .subscribeOn(getNetworkHelper().getSchedulerIo())
                    .observeOn(getNetworkHelper().getSchedulerUi())
                    .subscribe(storeListLiveData::setValue, throwable -> Dlog.e(throwable.getMessage())));
}

public MutableLiveData<List<StoreVO>> getStoreListLiveData() {
    return storeListLiveData;
}

public void addStoreList(List<StoreVO> storeList) {
    storeObservableList.clear();
    storeObservableList.addAll(storeList);
}

public ObservableList<StoreVO> getStoreObservableList() {
    return storeObservableList;
}

public void onFilterClick() {
    getNavigator().goToSearchFilterActivity();
}

public void onPrefTypeClicked(String prefSn) {
    getNavigator().onPrefClicked(prefSn, true);
}

}

和storeList由如下所示的适配器附加

public class StoreAdapter extends RecyclerView.Adapter<StoreAdapter.StoreViewHolder> {

private List<StoreVO> storeList;
private StoreFragment storeFragment;

public StoreAdapter() {
    this.storeList = new ArrayList<>();
}

@NonNull
@Override
public StoreViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    StoreItemListBinding binding = StoreItemListBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
    return new StoreViewHolder(binding);
}

@Override
public void onBindViewHolder(@NonNull StoreViewHolder holder, int index) {
    final int position = index;
    holder.bind(storeList.get(index));
    holder.itemView.setOnClickListener(v ->
            storeFragment.goToPlaceDetailActivity(storeList.get(position)));
}

@Override
public void onViewDetachedFromWindow(@NonNull StoreViewHolder holder) {
    holder.viewDetached();
    super.onViewDetachedFromWindow(holder);
}

@Override
public int getItemCount() {
    return storeList.size();
}

// Override for duplicated bugs
@Override
public long getItemId(int position) {
    return super.getItemId(position);
}

// Override for duplicated bugs
@Override
public int getItemViewType(int position) {
    return super.getItemViewType(position);
}

public List<StoreVO> getStoreList() {
    return storeList;
}

public void setStoreList(List<StoreVO> storeList) {
    this.storeList = storeList;
}

public void clearItems() {
    storeList.clear();
}

public void addItems(List<StoreVO> storeList) {
    this.storeList.addAll(storeList);
    notifyDataSetChanged();
}

public StoreFragment getStoreFragment() {
    return storeFragment;
}

public void setStoreFragment(StoreFragment storeFragment) {
    this.storeFragment = storeFragment;
}

class StoreViewHolder extends RecyclerView.ViewHolder {
    private StoreItemListBinding binding;
    private ArrayList<String> urlList;

    StoreViewHolder(StoreItemListBinding binding) {
        super(binding.getRoot());
        this.urlList = new ArrayList<>();
        this.binding = binding;
        initImageSlider();
    }

    public void bind(StoreVO storeVO) {
        binding.priceTv.setText(String.valueOf(storeVO.getReprMenuPrice()));
        binding.addrTv.setText(storeVO.getAreaDetailNm());
        binding.nameTv.setSelected(true);
        binding.nameTv.setText(storeVO.getStoreNm());
        binding.scoreTv.setText(String.format(Locale.KOREA, "%.1f", storeVO.getStoreScore()));
        addImageSlider(storeVO);
    }

    private void initImageSlider() {
        binding.storeSlider.setIndicatorAnimation(IndicatorAnimations.FILL); //set indicator animation by using SliderLayout.Animations. :WORM or THIN_WORM or COLOR or DROP or FILL or NONE or SCALE or SCALE_DOWN or SLIDE and SWAP!!
        binding.storeSlider.setScrollTimeInSec(3); //set scroll delay in seconds :
    }

    private void addImageSlider(StoreVO storeVO) {
        generateUrlList(storeVO);
        setSliderViews();
    }

    private void generateUrlList(StoreVO storeVO) {
        urlList.clear();
        if (storeVO.getStoreImageUrlList().size() == 0) {
            String url = CommonUtils.createDefaultImageUrl();
            urlList.add(url);
        } else {
            for (String imageUrl : storeVO.getStoreImageUrlList()) {
                String url = CommonUtils.createStoreImageUrl(storeVO.getStoreSn(), imageUrl);
                urlList.add(url);
            }
        }
    }

    private void setSliderViews() {
        binding.storeSlider.clearSliderViews();
        for (String url : urlList) {
            DefaultSliderView sliderView = new DefaultSliderView(binding.getRoot().getContext().getApplicationContext());
            sliderView.setImageUrl(url);

            sliderView.setImageScaleType(ImageView.ScaleType.CENTER_CROP);
            //sliderView.setOnSliderClickListener(view -> Dlog.e(url));
            //at last add this view in your layout :
            binding.storeSlider.addSliderView(sliderView);
        }
    }

    private void viewDetached() {
        urlList.clear();
        binding.storeSlider.clearSliderViews();
    }
}

}

更新storeList之后,Recylerview的项目上的文本已更改,但项目上的ImageSlider并未更改。 我检查了是否调用了StoreViewHolder上的viewDetached(),但图像仍保留在先前的商店商品中

我在github中使用图片滑块:https://github.com/smarteist/android-image-slider

我应该如何为可回收设备视图项目上的图像滑块更新图像?

为简化我的问题, 我正在使用RecyclerView来显示包含图像滑块的项目。该图像滑块通过URL加载图像。从服务器接收到新的itemList(storeList)后,已更改RecylerView的itemList(storeList)和ImageSlider的Item(Store)中的URL,但在ImageSlider上未更新。 通过调试,我检查了是否生成了新的UrlList并调用了setSliderViews,但仍保留先前的图像 如何修复我的代码以更新RecylerView物品上的图像?

0 个答案:

没有答案