diff options
author | euxane | 2024-09-18 23:41:13 +0200 |
---|---|---|
committer | euxane | 2024-09-18 23:41:13 +0200 |
commit | d166fcda24fdd5dcb2bcb9bb5500b751dfb9be0e (patch) | |
tree | 31701a1b317161d6089e2e118273f5aa67c559c8 | |
parent | 8ebbb2a54d31e5a88e4e89662bb4aec8d02c2d32 (diff) | |
download | tincapp-d166fcda24fdd5dcb2bcb9bb5500b751dfb9be0e.tar.gz |
activities/lists: workaround for now mishandled emptyView for ListView
3 files changed, 38 insertions, 12 deletions
diff --git a/app/src/main/java/org/pacien/tincapp/activities/start/NetworkListFragment.kt b/app/src/main/java/org/pacien/tincapp/activities/start/NetworkListFragment.kt index 9a25a0c..7b5006a 100644 --- a/app/src/main/java/org/pacien/tincapp/activities/start/NetworkListFragment.kt +++ b/app/src/main/java/org/pacien/tincapp/activities/start/NetworkListFragment.kt | |||
@@ -31,6 +31,7 @@ import org.pacien.tincapp.activities.BaseFragment | |||
31 | import org.pacien.tincapp.databinding.StartNetworkListBinding | 31 | import org.pacien.tincapp.databinding.StartNetworkListBinding |
32 | import org.pacien.tincapp.extensions.hideBottomSeparator | 32 | import org.pacien.tincapp.extensions.hideBottomSeparator |
33 | import org.pacien.tincapp.extensions.setElements | 33 | import org.pacien.tincapp.extensions.setElements |
34 | import org.pacien.tincapp.extensions.updatePlaceholderVisibility | ||
34 | 35 | ||
35 | /** | 36 | /** |
36 | * @author euxane | 37 | * @author euxane |
@@ -55,7 +56,6 @@ class NetworkListFragment : BaseFragment() { | |||
55 | val listHeaderView = layoutInflater.inflate(R.layout.start_network_list_header, startNetworkListBinding.root, false) | 56 | val listHeaderView = layoutInflater.inflate(R.layout.start_network_list_header, startNetworkListBinding.root, false) |
56 | startNetworkListBinding.startNetworkList.addHeaderView(listHeaderView, null, false) | 57 | startNetworkListBinding.startNetworkList.addHeaderView(listHeaderView, null, false) |
57 | startNetworkListBinding.startNetworkList.hideBottomSeparator() | 58 | startNetworkListBinding.startNetworkList.hideBottomSeparator() |
58 | startNetworkListBinding.startNetworkList.emptyView = startNetworkListBinding.startNetworkListPlaceholder | ||
59 | startNetworkListBinding.startNetworkList.onItemClickListener = AdapterView.OnItemClickListener(this::onItemClick) | 59 | startNetworkListBinding.startNetworkList.onItemClickListener = AdapterView.OnItemClickListener(this::onItemClick) |
60 | startNetworkListBinding.startNetworkList.adapter = networkListAdapter | 60 | startNetworkListBinding.startNetworkList.adapter = networkListAdapter |
61 | } | 61 | } |
@@ -67,13 +67,10 @@ class NetworkListFragment : BaseFragment() { | |||
67 | } | 67 | } |
68 | 68 | ||
69 | private fun updateNetworkList(networks: List<String>) { | 69 | private fun updateNetworkList(networks: List<String>) { |
70 | startNetworkListBinding.startNetworkList.updatePlaceholderVisibility( | ||
71 | startNetworkListBinding.startNetworkListPlaceholder, | ||
72 | networks.isEmpty() | ||
73 | ) | ||
70 | networkListAdapter.setElements(networks) | 74 | networkListAdapter.setElements(networks) |
71 | if (networks.isEmpty()) updatePlaceholder() | ||
72 | } | ||
73 | |||
74 | private fun updatePlaceholder() { | ||
75 | startNetworkListBinding.startNetworkListPlaceholder.post { | ||
76 | startNetworkListBinding.startNetworkListPlaceholderText?.text = getString(R.string.start_network_list_empty_none_found) | ||
77 | } | ||
78 | } | 75 | } |
79 | } | 76 | } |
diff --git a/app/src/main/java/org/pacien/tincapp/activities/status/nodes/NodeListFragment.kt b/app/src/main/java/org/pacien/tincapp/activities/status/nodes/NodeListFragment.kt index 05c65d7..474ab6e 100644 --- a/app/src/main/java/org/pacien/tincapp/activities/status/nodes/NodeListFragment.kt +++ b/app/src/main/java/org/pacien/tincapp/activities/status/nodes/NodeListFragment.kt | |||
@@ -18,7 +18,6 @@ | |||
18 | 18 | ||
19 | package org.pacien.tincapp.activities.status.nodes | 19 | package org.pacien.tincapp.activities.status.nodes |
20 | 20 | ||
21 | import androidx.lifecycle.Observer | ||
22 | import androidx.lifecycle.ViewModelProviders | 21 | import androidx.lifecycle.ViewModelProviders |
23 | import android.os.Bundle | 22 | import android.os.Bundle |
24 | import androidx.appcompat.app.AlertDialog | 23 | import androidx.appcompat.app.AlertDialog |
@@ -33,6 +32,7 @@ import org.pacien.tincapp.databinding.StatusNodeListFragmentBinding | |||
33 | import org.pacien.tincapp.extensions.hideBottomSeparator | 32 | import org.pacien.tincapp.extensions.hideBottomSeparator |
34 | import org.pacien.tincapp.extensions.hideTopSeparator | 33 | import org.pacien.tincapp.extensions.hideTopSeparator |
35 | import org.pacien.tincapp.extensions.setElements | 34 | import org.pacien.tincapp.extensions.setElements |
35 | import org.pacien.tincapp.extensions.updatePlaceholderVisibility | ||
36 | import org.pacien.tincapp.service.TincVpnService | 36 | import org.pacien.tincapp.service.TincVpnService |
37 | 37 | ||
38 | /** | 38 | /** |
@@ -44,12 +44,11 @@ class NodeListFragment : BaseFragment() { | |||
44 | private val netName by lazy { vpnService.getCurrentNetName()!! } | 44 | private val netName by lazy { vpnService.getCurrentNetName()!! } |
45 | private val nodeListViewModel by lazy { ViewModelProviders.of(this).get(NodeListViewModel::class.java) } | 45 | private val nodeListViewModel by lazy { ViewModelProviders.of(this).get(NodeListViewModel::class.java) } |
46 | private val nodeListAdapter by lazy { NodeInfoArrayAdapter(requireContext(), this::onItemClick) } | 46 | private val nodeListAdapter by lazy { NodeInfoArrayAdapter(requireContext(), this::onItemClick) } |
47 | private val nodeListObserver by lazy { Observer<List<NodeInfo>> { nodeListAdapter.setElements(it) } } | ||
48 | private lateinit var statusNodeListFragmentBinding: StatusNodeListFragmentBinding | 47 | private lateinit var statusNodeListFragmentBinding: StatusNodeListFragmentBinding |
49 | 48 | ||
50 | override fun onCreate(savedInstanceState: Bundle?) { | 49 | override fun onCreate(savedInstanceState: Bundle?) { |
51 | super.onCreate(savedInstanceState) | 50 | super.onCreate(savedInstanceState) |
52 | nodeListViewModel.nodeList.observe(this, nodeListObserver) | 51 | nodeListViewModel.nodeList.observe(this) { updateNodeList(it) } |
53 | } | 52 | } |
54 | 53 | ||
55 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { | 54 | override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { |
@@ -60,10 +59,17 @@ class NodeListFragment : BaseFragment() { | |||
60 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { | 59 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { |
61 | statusNodeListFragmentBinding.statusNodeList.hideTopSeparator() | 60 | statusNodeListFragmentBinding.statusNodeList.hideTopSeparator() |
62 | statusNodeListFragmentBinding.statusNodeList.hideBottomSeparator() | 61 | statusNodeListFragmentBinding.statusNodeList.hideBottomSeparator() |
63 | statusNodeListFragmentBinding.statusNodeList.emptyView = statusNodeListFragmentBinding.statusNodeListPlaceholder | ||
64 | statusNodeListFragmentBinding.statusNodeList.adapter = nodeListAdapter | 62 | statusNodeListFragmentBinding.statusNodeList.adapter = nodeListAdapter |
65 | } | 63 | } |
66 | 64 | ||
65 | private fun updateNodeList(nodes: List<NodeInfo>) { | ||
66 | statusNodeListFragmentBinding.statusNodeList.updatePlaceholderVisibility( | ||
67 | statusNodeListFragmentBinding.statusNodeListPlaceholder, | ||
68 | nodes.isEmpty() | ||
69 | ) | ||
70 | nodeListAdapter.setElements(nodes) | ||
71 | } | ||
72 | |||
67 | private fun onItemClick(nodeInfo: NodeInfo) = | 73 | private fun onItemClick(nodeInfo: NodeInfo) = |
68 | showNodeInfo(nodeInfo.name) | 74 | showNodeInfo(nodeInfo.name) |
69 | 75 | ||
diff --git a/app/src/main/java/org/pacien/tincapp/extensions/ListViewExtensions.kt b/app/src/main/java/org/pacien/tincapp/extensions/ListViewExtensions.kt index 9501a8d..8a52484 100644 --- a/app/src/main/java/org/pacien/tincapp/extensions/ListViewExtensions.kt +++ b/app/src/main/java/org/pacien/tincapp/extensions/ListViewExtensions.kt | |||
@@ -45,3 +45,26 @@ fun ListView.hideTopSeparator() { | |||
45 | fun ListView.hideBottomSeparator() { | 45 | fun ListView.hideBottomSeparator() { |
46 | addFooterView(View(context), null, false) | 46 | addFooterView(View(context), null, false) |
47 | } | 47 | } |
48 | |||
49 | /** | ||
50 | * Workaround for mishandled list emptyView since Android SDK 34: | ||
51 | |||
52 | java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams | ||
53 | at android.widget.ListView.removeUnusedFixedViews(ListView.java:2001) | ||
54 | at android.widget.ListView.layoutChildren(ListView.java:1860) | ||
55 | at android.widget.AbsListView.onLayout(AbsListView.java:2271) | ||
56 | at android.widget.AdapterView.updateEmptyStatus(AdapterView.java:794) | ||
57 | at android.widget.AdapterView.checkFocus(AdapterView.java:767) | ||
58 | at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:859) | ||
59 | at android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:6949) | ||
60 | at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:38) | ||
61 | at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:54) | ||
62 | at android.widget.ArrayAdapter.notifyDataSetChanged(ArrayAdapter.java:355) | ||
63 | at org.pacien.tincapp.extensions.ListViewExtensionsKt.setElements(ListViewExtensions.kt:36) | ||
64 | */ | ||
65 | fun ListView.updatePlaceholderVisibility(placeholderView: View, usePlaceholder: Boolean) { | ||
66 | post { | ||
67 | placeholderView.visibility = if (usePlaceholder) View.VISIBLE else View.GONE | ||
68 | visibility = if (usePlaceholder) View.GONE else View.VISIBLE | ||
69 | } | ||
70 | } \ No newline at end of file | ||