From 7d3e79684204e8df60eaf8d3985c22317f6594ef Mon Sep 17 00:00:00 2001 From: Samuel Holland Date: Mon, 7 Aug 2017 19:46:19 -0500 Subject: ObservableArrayMapAdapter: Copy ObservableListAdapter Since the conversion to a sequential list (to implement ListAdapter) depends on the implementation detail that ObservableArrayMap is backed by an array, we can't use the ObservableMap interface here. Signed-off-by: Jason A. Donenfeld --- .../android/ObservableArrayMapAdapter.java | 84 ++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 app/src/main/java/com/wireguard/android/ObservableArrayMapAdapter.java (limited to 'app/src/main/java/com/wireguard/android/ObservableArrayMapAdapter.java') diff --git a/app/src/main/java/com/wireguard/android/ObservableArrayMapAdapter.java b/app/src/main/java/com/wireguard/android/ObservableArrayMapAdapter.java new file mode 100644 index 00000000..d2a5a4cc --- /dev/null +++ b/app/src/main/java/com/wireguard/android/ObservableArrayMapAdapter.java @@ -0,0 +1,84 @@ +package com.wireguard.android; + +import android.content.Context; +import android.databinding.DataBindingUtil; +import android.databinding.ObservableArrayMap; +import android.databinding.ObservableMap; +import android.databinding.ViewDataBinding; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.ListAdapter; + +import java.lang.ref.WeakReference; + +/** + * A generic ListAdapter backed by an ObservableMap. + */ + +class ObservableArrayMapAdapter extends BaseAdapter implements ListAdapter { + private final int layoutId; + private final LayoutInflater layoutInflater; + private ObservableArrayMap map; + private final OnMapChangedCallback callback = new OnMapChangedCallback<>(this); + + ObservableArrayMapAdapter(Context context, int layoutId, ObservableArrayMap map) { + this.layoutInflater = LayoutInflater.from(context); + this.layoutId = layoutId; + setMap(map); + } + + @Override + public int getCount() { + return map != null ? map.size() : 0; + } + + @Override + public V getItem(int position) { + return map != null ? map.get(map.keyAt(position)) : null; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewDataBinding binding = DataBindingUtil.getBinding(convertView); + if (binding == null) + binding = DataBindingUtil.inflate(layoutInflater, layoutId, parent, false); + binding.setVariable(BR.item, getItem(position)); + binding.executePendingBindings(); + return binding.getRoot(); + } + + public void setMap(ObservableArrayMap newMap) { + if (map != null) + map.removeOnMapChangedCallback(callback); + map = newMap; + if (map != null) { + map.addOnMapChangedCallback(callback); + } + } + + private static class OnMapChangedCallback + extends ObservableMap.OnMapChangedCallback, K, V> { + + private final WeakReference> weakAdapter; + + private OnMapChangedCallback(ObservableArrayMapAdapter adapter) { + weakAdapter = new WeakReference<>(adapter); + } + + @Override + public void onMapChanged(ObservableMap sender, K key) { + final ObservableArrayMapAdapter adapter = weakAdapter.get(); + if (adapter != null) + adapter.notifyDataSetChanged(); + else + sender.removeOnMapChangedCallback(this); + } + } +} -- cgit v1.3-18-gd494