基于DataBinding的基类(Activity、Fragment、Adapter)

2023-05-16

基于DataBinding的基类(Activity、Fragment、Adapter)

1、BaseBindActivity

public abstract class BaseBindActivity<DB extends ViewDataBinding> extends AppCompatActivity{

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DB db = DataBindingUtil.setContentView(this, getLayoutId());
        initView(db);
    }

    /**
     * 获取资源ID
     *
     * @return 布局资源ID
     */
    protected abstract int getLayoutId();

    /**
     * 初始化界面
     * @param bindView 界面绑定对象
     */
    protected abstract void initView(DB bindView);
}

布局文件示例

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="example"
            type="String" />
    </data>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
        	android:text="@{example}"
            android:layout_width="wrap_context"
            android:layout_height="wrap_context"/>
    </LinearLayout>
</layout>

简单调用

public class MainActivity extends BaseBindActivity<AcitivtyMainBinding> {
    @Override
    protected int getLayoutId() {
        return R.layout.acitivty_main;
    }

    @Override
    protected void initView(final AcitivtyMainBinding bindView) {
    	bindView.setExample("示例");
	}
}

2、BaseBindFragment

public abstract class BaseBindFragment<DB extends ViewDataBinding> extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        DB db = DataBindingUtil.inflate(inflater, getLayoutId(), container, false);
        initView(db);
        return db.getRoot();
    }

    /**
     * 获取资源ID
     *
     * @return 布局资源ID
     */
    protected abstract int getLayoutId();

    /**
     * 初始化界面
     * @param bindView 界面绑定对象
     */
    protected abstract void initView(DB bindView);
}

3、BaseBindAdapter

①继承RecycleView.Adapter

public abstract class BaseBindAdapter<DB extends ViewDataBinding, T> extends RecyclerView.Adapter<BaseBindAdapter.BindViewHolder> {

    private List<T> list;
    private int resourceId;

    public BaseBindAdapter(List<T> list, int resourceId) {
        this.list = list;
        this.resourceId = resourceId;
        if (this.list == null) {
            this.list = new ArrayList<T>();
        }
    }

    @NonNull
    @Override
    public BaseBindAdapter.BindViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        DB db = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), resourceId, parent, false);
        BindViewHolder holder = new BindViewHolder(db.getRoot());
        holder.bindView = db;
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull BaseBindAdapter.BindViewHolder holder, int position) {

    }

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

    public class BindViewHolder extends RecyclerView.ViewHolder {

        public DB bindView;

        public BindViewHolder(@NonNull View itemView) {
            super(itemView);
        }
    }
}

②继承PagerAdapter

public abstract class BaseBindPagerAdapter<DB extends ViewDataBinding, K, V> extends PagerAdapter {
    private LinkedHashMap<K, V> map;
    private LinkedHashMap<K, View> views;
    private Map<Integer, K> temp;

    public BaseBindPagerAdapter(LinkedHashMap<K, V> map) {
        this.map = map;
        if(map == null) {
            map = new LinkedHashMap<>(0);
        }
        views = new LinkedHashMap<>(map.size());
        temp = new LinkedHashMap<>(map.size());
        Iterator<Map.Entry<K, V>> iterator = map.entrySet().iterator();
        int position = 0;
        while (iterator.hasNext()) {
            Map.Entry<K, V> next = iterator.next();
            temp.put(position++, next.getKey());
        }
    }

    @Override
    public int getCount() {
        return map.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == object;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        DB binding = DataBindingUtil.inflate(LayoutInflater.from(container.getContext()), getResourceId(), container, false);
        BindViewHolder holder = new BindViewHolder();
        holder.bindView = binding;
        initView(holder, temp.get(position));
        views.put(temp.get(position), binding.getRoot());
        container.addView(binding.getRoot());
        return binding.getRoot();
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView(views.get(temp.get(position)));
    }

    protected class BindViewHolder {
        public DB bindView;
    }

    /**
     * 获取资源ID
     *
     * @return 布局资源ID
     */
    public abstract int getResourceId();

    /**
     * 初始化界面
     * @param holder 界面句柄
     * @param key 子项对应的键
     * @param value 子项实例
     * */
    public abstract void initView(BindViewHolder holder, K key, V value);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于DataBinding的基类(Activity、Fragment、Adapter) 的相关文章

随机推荐