个人项目---随手记(四)

前面几篇文章主要是说了下网络数据的获取,数据库的操作,列表视图数据绑定......这篇文章说下详情页数据的绑定。详情页数据比较多,类型复杂,其中涉及的list数组在页面间的传递。当然,方法很多,可以采用bean类,实现Serializable接口,序列化与反序列化,这确实可行,但是本文采用另一种方法——EventBus(事件总线),这个开源框架用来传递各种消息、数据、订阅事件等等简单粗暴,一目了然。话不多说,开始本文的正文。

1、Android Studio添加依赖库

//事件总线
compile 'org.greenrobot:eventbus:3.0.0'

2、如何使用呢?

2.1、哪个页面需要接收EventBus传过来的数据,就在哪个页面注册/解注册EventBus

//在要接收消息的页面注册:一般是在onCreate中执行
EventBus.getDefault().register(CookDetailActivity.this);
@Override
protected void onDestroy() {
    super.onDestroy();
    EventBus.getDefault().unregister(CookDetailActivity.this);
}
2.2、创建EventBus用来传递的实体类

public class CookMaterialEvent {

    private List material;

    public CookMaterialEvent(List material) {
        this.material=material;
    }

    public List getMaterial() {
        return material;
    }

    public void setMaterial(List material) {
        this.material = material;
    }
}
2.3、在页面跳转是启动EventBus传递数据

EventBus.getDefault().postSticky(new CookMaterialEvent(material));

2.4、接收数据

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEventMainThread(CookMaterialEvent event) {
    materialBeanList = event.getMaterial();
    //TODO 将材料绑定到 ListView    MaterialAdapter adapter = new MaterialAdapter(this, materialBeanList);
    mListView_material.setAdapter(adapter);
    fixListViewHeight(mListView_material);
}

这样就成功的就把list数组重一个页面传递到另一个页面了。个人认为,这个方法要比序列化/反序列化更容易懂,更容易运用。

3、在SrcollView和ListView同时存在的情况下,ListView会出现显示不完全的小小bug,因为在多个滑动控件的情况下,会存在滑动控件计算异常的问题,这就需要自己简单的定义下控件的item的计算方法

/**
 * 解决ScrollView嵌套ListView时,会无法正确的计算ListView的大小
 */
private void fixListViewHeight(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    ViewGroup.LayoutParams params = listView.getLayoutParams();
    if (listAdapter == null) {
        return;
    }
    int totalHeight = 0;
    View view;
    for (int i = 0; i < listAdapter.getCount(); i++) {
        view = listAdapter.getView(i, null, listView);
        //TODO 宽度为屏幕宽度
        int i1 = View.MeasureSpec.makeMeasureSpec(getScreenWidth(this), View.MeasureSpec.EXACTLY);
        //TODO 根据屏幕宽度计算高度
        int i2 = View.MeasureSpec.makeMeasureSpec(i1, View.MeasureSpec.UNSPECIFIED);
        view.measure(i1, i2);
        totalHeight += view.getMeasuredHeight();
    }
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
}

private int getScreenWidth(Context context) {
    WindowManager manager = (WindowManager) context
            .getSystemService(Context.WINDOW_SERVICE);
    Display display = manager.getDefaultDisplay();
    return display.getWidth();
}

好了,今天就说这么多吧,我觉得我应该是把EventBus的使用方法介绍清楚了。


你可能感兴趣的:(个人项目---随手记(四))