Activity 解析數據(如輪播圖 URL 列表),需傳遞給同一 Activity 內的 PagerAdapter 顯示,**不啟動新 Activity**,不使用 startActivity。
public interface OnDataReadyListener {
void onSliderDataReady(List<String> imageUrls, List<String> linkUrls);
}
public class AdvertisementAdapter extends PagerAdapter implements OnDataReadyListener {
private List<String> mImageUrls = new ArrayList<>();
private List<String> mLinkUrls = new ArrayList<>();
@Override
public void onSliderDataReady(List<String> imageUrls, List<String> linkUrls) {
this.mImageUrls.clear();
this.mImageUrls.addAll(imageUrls);
this.mLinkUrls.clear();
this.mLinkUrls.addAll(linkUrls);
notifyDataSetChanged(); // 刷新 ViewPager
}
// getItem/instantiateItem 中使用 mImageUrls, mLinkUrls
// 點擊事件中直接用 mLinkUrls.get(position) 跳轉
}
AdvertisementAdapter adapter = new AdvertisementAdapter();
// ... 解析 JSON 後
adapter.onSliderDataReady(imageUrls, linkUrls);
public class SliderViewModel extends ViewModel {
private MutableLiveData<Pair<List<String>, List<String>>> sliderData = new MutableLiveData<>();
public void setData(List<String> images, List<String> links) {
sliderData.setValue(new Pair<>(images, links));
}
public LiveData<Pair<List<String>, List<String>>> getData() {
return sliderData;
}
}
// Activity 中
SliderViewModel vm = new ViewModelProvider(this).get(SliderViewModel.class);
vm.setData(imageUrls, linkUrls);
// Adapter 中(需持有 LifecycleOwner 或在 Activity 觀察後傳給 Adapter)
vm.getData().observe(this, pair -> adapter.updateData(pair.first, pair.second));
優勢:配置變更(旋轉屏幕)數據不丟,自動生命周期管理。
// 定義事件
public class SliderDataEvent {
public final List<String> images;
public final List<String> links;
public SliderDataEvent(List<String> i, List<String> l) { images = i; links = l; }
}
// Activity 發送
EventBus.getDefault().post(new SliderDataEvent(imageUrls, linkUrls));
// Adapter 訂閱(需註冊/反註冊)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onSliderData(SliderDataEvent event) {
updateData(event.images, event.links);
}
@Override
public void onAttachedToWindow() { super.onAttachedToWindow(); EventBus.getDefault().register(this); }
@Override
public void onDetachedFromWindow() { super.onDetachedFromWindow(); EventBus.getDefault().unregister(this); }
| 維度 | 接口回調 | ViewModel | EventBus |
|---|---|---|---|
| 耦合度 | 低(面向接口) | 低(共享實例) | 極低(事件總線) |
| 生命周期感知 | 無 | 有 | 無 |
| 配置變更保活 | 需手動處理 | 自動 | 需手動處理 |
| 適用場景 | 同 Activity 內、簡單直接 | 現代架構、需跨 Fragment/Activity | 跨模塊、多發多收、插件化 |
| 依賴庫 | 無 | lifecycle-viewmodel | greenrobot/EventBus 或 RxJava |
onCreate 建立並持有引用。mLinkUrls.get(position),避免閉包捕獲舊變量。Activity 到 Adapter 傳值**無需 startActivity**。**接口回調**最簡直接,**ViewModel**最規範,**EventBus**最解耦。根據項目架構選型,核心原則:**Adapter 持有數據引用,數據源更新後 notifyDataSetChanged()**。