OSDN Git Service

Convert all ListViews to RecyclerView
authorBraden Farmer <farmerbb@gmail.com>
Thu, 7 Nov 2019 05:32:08 +0000 (22:32 -0700)
committerBraden Farmer <farmerbb@gmail.com>
Thu, 7 Nov 2019 05:32:08 +0000 (22:32 -0700)
app/src/main/java/com/farmerbb/taskbar/activity/DesktopIconSelectAppActivity.java
app/src/main/java/com/farmerbb/taskbar/activity/IconPackActivity.java
app/src/main/java/com/farmerbb/taskbar/activity/SelectAppActivity.java
app/src/main/java/com/farmerbb/taskbar/adapter/AppListAdapter.java
app/src/main/java/com/farmerbb/taskbar/adapter/DesktopIconAppListAdapter.java
app/src/main/java/com/farmerbb/taskbar/fragment/SelectAppFragment.java
app/src/main/res/layout/tb_desktop_icon_row.xml
app/src/main/res/layout/tb_desktop_icon_select_app.xml
app/src/main/res/layout/tb_recyclerview.xml [new file with mode: 0644]
app/src/main/res/layout/tb_row_blacklist.xml
app/src/main/res/layout/tb_select_app.xml

index 1b46144..f70ef34 100644 (file)
@@ -28,9 +28,10 @@ import android.os.UserHandle;
 import android.os.UserManager;
 import android.support.v4.content.LocalBroadcastManager;
 import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
 import android.view.View;
 import android.view.WindowManager;
-import android.widget.ListView;
 import android.widget.ProgressBar;
 
 import com.farmerbb.taskbar.R;
@@ -52,7 +53,7 @@ public class DesktopIconSelectAppActivity extends AppCompatActivity {
 
     private DesktopIconAppListGenerator appListGenerator;
     private ProgressBar progressBar;
-    private ListView appList;
+    private RecyclerView appList;
 
     private DesktopIconInfo desktopIcon;
 
@@ -163,12 +164,13 @@ public class DesktopIconSelectAppActivity extends AppCompatActivity {
                 entries.add(entry);
             }
 
-            return new DesktopIconAppListAdapter(DesktopIconSelectAppActivity.this, R.layout.tb_desktop_icon_row, entries);
+            return new DesktopIconAppListAdapter(DesktopIconSelectAppActivity.this, entries);
         }
 
         @Override
         protected void onPostExecute(DesktopIconAppListAdapter adapter) {
             progressBar.setVisibility(View.GONE);
+            appList.setLayoutManager(new LinearLayoutManager(DesktopIconSelectAppActivity.this));
             appList.setAdapter(adapter);
             setFinishOnTouchOutside(true);
         }
index d66e24a..7d6b0d3 100644 (file)
@@ -16,7 +16,6 @@
 package com.farmerbb.taskbar.activity;
 
 import android.content.ActivityNotFoundException;
-import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.content.pm.PackageManager;
@@ -24,18 +23,17 @@ import android.os.AsyncTask;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
-import android.widget.ListView;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
-import com.farmerbb.taskbar.BuildConfig;
 import com.farmerbb.taskbar.R;
 import com.farmerbb.taskbar.util.IconPack;
 import com.farmerbb.taskbar.util.IconPackManager;
@@ -50,7 +48,7 @@ public class IconPackActivity extends AppCompatActivity {
 
     private AppListGenerator appListGenerator;
     private ProgressBar progressBar;
-    private ListView appList;
+    private RecyclerView appList;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -84,25 +82,31 @@ public class IconPackActivity extends AppCompatActivity {
         } catch (ActivityNotFoundException e) { /* Gracefully fail */ }
     }
 
-    private class AppListAdapter extends ArrayAdapter<IconPack> {
-        AppListAdapter(Context context, int layout, List<IconPack> list) {
-            super(context, layout, list);
+    private class AppListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+        private List<IconPack> entries = new ArrayList<>();
+
+        AppListAdapter(List<IconPack> list) {
+            entries.addAll(list);
         }
 
+        @NonNull
         @Override
-        public @NonNull View getView(int position, View convertView, final @NonNull ViewGroup parent) {
-            // Check if an existing view is being reused, otherwise inflate the view
-            if(convertView == null)
-                convertView = LayoutInflater.from(getContext()).inflate(R.layout.tb_row, parent, false);
+        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+            View view = LayoutInflater.from(IconPackActivity.this).inflate(R.layout.tb_desktop_icon_row, viewGroup, false);
+            return new RecyclerView.ViewHolder(view) {};
+        }
 
-            final IconPack entry = getItem(position);
+        @Override
+        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
+            final IconPack entry = entries.get(i);
             assert entry != null;
 
-            TextView textView = convertView.findViewById(R.id.name);
+            TextView textView = viewHolder.itemView.findViewById(R.id.name);
             textView.setText(entry.getName());
 
             PackageManager pm = getPackageManager();
-            ImageView imageView = convertView.findViewById(R.id.icon);
+            ImageView imageView = viewHolder.itemView.findViewById(R.id.icon);
 
             if(entry.getPackageName().equals(getPackageName())) {
                 imageView.setImageDrawable(null);
@@ -114,7 +118,7 @@ public class IconPackActivity extends AppCompatActivity {
                 }
             }
 
-            LinearLayout layout = convertView.findViewById(R.id.entry);
+            LinearLayout layout = viewHolder.itemView.findViewById(R.id.entry);
             layout.setOnClickListener(view -> {
                 SharedPreferences pref = U.getSharedPreferences(IconPackActivity.this);
                 pref.edit().putString("icon_pack", entry.getPackageName()).apply();
@@ -134,8 +138,11 @@ public class IconPackActivity extends AppCompatActivity {
                 }
                 return false;
             });
+        }
 
-            return convertView;
+        @Override
+        public int getItemCount() {
+            return entries.size();
         }
     }
 
@@ -156,7 +163,7 @@ public class IconPackActivity extends AppCompatActivity {
                 finalList.add(dummyIconPack);
                 finalList.addAll(list);
 
-                return new AppListAdapter(IconPackActivity.this, R.layout.tb_row, finalList);
+                return new AppListAdapter(finalList);
             }
         }
 
@@ -168,6 +175,7 @@ public class IconPackActivity extends AppCompatActivity {
                 finish();
             } else {
                 progressBar.setVisibility(View.GONE);
+                appList.setLayoutManager(new LinearLayoutManager(IconPackActivity.this));
                 appList.setAdapter(adapter);
                 setFinishOnTouchOutside(true);
             }
index ef110fc..e8d27db 100644 (file)
@@ -245,8 +245,8 @@ public class SelectAppActivity extends AppCompatActivity {
             }
 
             return new AppListAdapter[] {
-                    new AppListAdapter(SelectAppActivity.this, R.layout.tb_row_blacklist, entries, U.HIDDEN),
-                    new AppListAdapter(SelectAppActivity.this, R.layout.tb_row_blacklist, entries, U.TOP_APPS)
+                    new AppListAdapter(SelectAppActivity.this, entries, U.HIDDEN),
+                    new AppListAdapter(SelectAppActivity.this, entries, U.TOP_APPS)
             };
         }
 
index 4053aa8..cfedb17 100644 (file)
@@ -17,10 +17,10 @@ package com.farmerbb.taskbar.adapter;
 
 import android.content.Context;
 import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
 import android.widget.CheckBox;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -32,40 +32,52 @@ import com.farmerbb.taskbar.util.BlacklistEntry;
 import com.farmerbb.taskbar.util.TopApps;
 import com.farmerbb.taskbar.util.U;
 
+import java.util.ArrayList;
 import java.util.List;
 
-public class AppListAdapter extends ArrayAdapter<BlacklistEntry> {
-    private final Blacklist blacklist = Blacklist.getInstance(getContext());
-    private final TopApps topApps = TopApps.getInstance(getContext());
+public class AppListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+    private final Blacklist blacklist;
+    private final TopApps topApps;
 
+    private Context context;
+    private List<BlacklistEntry> entries = new ArrayList<>();
     private int type;
 
-    public AppListAdapter(Context context, int layout, List<BlacklistEntry> list, int type) {
-        super(context, layout, list);
-
+    public AppListAdapter(Context context, List<BlacklistEntry> list, int type) {
+        this.context = context;
+        entries.addAll(list);
         this.type = type;
+
+        blacklist = Blacklist.getInstance(context);
+        topApps = TopApps.getInstance(context);
     }
 
+    @NonNull
     @Override
-    public @NonNull View getView(int position, View convertView, final @NonNull ViewGroup parent) {
-        // Check if an existing view is being reused, otherwise inflate the view
-        if(convertView == null)
-            convertView = LayoutInflater.from(getContext()).inflate(R.layout.tb_row_blacklist, parent, false);
+    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+        View view = LayoutInflater.from(context).inflate(R.layout.tb_row_blacklist, viewGroup, false);
+        return new RecyclerView.ViewHolder(view) {};
+    }
 
+    @Override
+    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
         switch(type) {
             case U.HIDDEN:
-                setupHidden(position, convertView);
+                setupHidden(i, viewHolder.itemView);
                 break;
             case U.TOP_APPS:
-                setupTopApps(position, convertView);
+                setupTopApps(i, viewHolder.itemView);
                 break;
         }
+    }
 
-        return convertView;
+    @Override
+    public int getItemCount() {
+        return entries.size();
     }
 
     private void setupHidden(int position, View convertView) {
-        final BlacklistEntry entry = getItem(position);
+        final BlacklistEntry entry = entries.get(position);
         assert entry != null;
 
         final String componentName = entry.getPackageName();
@@ -85,27 +97,27 @@ public class AppListAdapter extends ArrayAdapter<BlacklistEntry> {
             if(topApps.isTopApp(componentName)
                     || topApps.isTopApp(componentNameAlt)
                     || topApps.isTopApp(componentNameAlt2)) {
-                U.showToast(getContext(),
-                        getContext().getString(R.string.tb_already_top_app, entry.getLabel()),
+                U.showToast(context,
+                        context.getString(R.string.tb_already_top_app, entry.getLabel()),
                         Toast.LENGTH_LONG);
             } else if(blacklist.isBlocked(componentName)) {
-                blacklist.removeBlockedApp(getContext(), componentName);
+                blacklist.removeBlockedApp(context, componentName);
                 checkBox.setChecked(false);
             } else if(blacklist.isBlocked(componentNameAlt)) {
-                blacklist.removeBlockedApp(getContext(), componentNameAlt);
+                blacklist.removeBlockedApp(context, componentNameAlt);
                 checkBox.setChecked(false);
             } else if(blacklist.isBlocked(componentNameAlt2)) {
-                blacklist.removeBlockedApp(getContext(), componentNameAlt2);
+                blacklist.removeBlockedApp(context, componentNameAlt2);
                 checkBox.setChecked(false);
             } else {
-                blacklist.addBlockedApp(getContext(), entry);
+                blacklist.addBlockedApp(context, entry);
                 checkBox.setChecked(true);
             }
         });
     }
 
     private void setupTopApps(int position, View convertView) {
-        final BlacklistEntry entry = getItem(position);
+        final BlacklistEntry entry = entries.get(position);
         assert entry != null;
 
         final String componentName = entry.getPackageName();
@@ -125,20 +137,20 @@ public class AppListAdapter extends ArrayAdapter<BlacklistEntry> {
             if(blacklist.isBlocked(componentName)
                     || blacklist.isBlocked(componentNameAlt)
                     || blacklist.isBlocked(componentNameAlt2)) {
-                U.showToast(getContext(),
-                        getContext().getString(R.string.tb_already_blacklisted, entry.getLabel()),
+                U.showToast(context,
+                        context.getString(R.string.tb_already_blacklisted, entry.getLabel()),
                         Toast.LENGTH_LONG);
             } else if(topApps.isTopApp(componentName)) {
-                topApps.removeTopApp(getContext(), componentName);
+                topApps.removeTopApp(context, componentName);
                 checkBox.setChecked(false);
             } else if(topApps.isTopApp(componentNameAlt)) {
-                topApps.removeTopApp(getContext(), componentNameAlt);
+                topApps.removeTopApp(context, componentNameAlt);
                 checkBox.setChecked(false);
             } else if(topApps.isTopApp(componentNameAlt2)) {
-                topApps.removeTopApp(getContext(), componentNameAlt2);
+                topApps.removeTopApp(context, componentNameAlt2);
                 checkBox.setChecked(false);
             } else {
-                topApps.addTopApp(getContext(), entry);
+                topApps.addTopApp(context, entry);
                 checkBox.setChecked(true);
             }
         });
index a4813d3..fb0014e 100644 (file)
 package com.farmerbb.taskbar.adapter;
 
 import android.content.Context;
+import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -28,34 +29,46 @@ import com.farmerbb.taskbar.R;
 import com.farmerbb.taskbar.activity.DesktopIconSelectAppActivity;
 import com.farmerbb.taskbar.util.AppEntry;
 
+import java.util.ArrayList;
 import java.util.List;
 
-public class DesktopIconAppListAdapter extends ArrayAdapter<AppEntry> {
-    public DesktopIconAppListAdapter(Context context, int layout, List<AppEntry> list) {
-        super(context, layout, list);
+public class DesktopIconAppListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+
+    private Context context;
+    private List<AppEntry> entries = new ArrayList<>();
+
+    public DesktopIconAppListAdapter(Context context, List<AppEntry> list) {
+        this.context = context;
+        entries.addAll(list);
     }
 
+    @NonNull
     @Override
-    public View getView(int position, View convertView, final ViewGroup parent) {
-        // Check if an existing view is being reused, otherwise inflate the view
-        if(convertView == null)
-            convertView = LayoutInflater.from(getContext()).inflate(R.layout.tb_desktop_icon_row, parent, false);
+    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+        View view = LayoutInflater.from(context).inflate(R.layout.tb_desktop_icon_row, viewGroup, false);
+        return new RecyclerView.ViewHolder(view) {};
+    }
 
-        final AppEntry entry = getItem(position);
+    @Override
+    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
+        final AppEntry entry = entries.get(i);
         assert entry != null;
 
-        TextView textView = convertView.findViewById(R.id.name);
+        TextView textView = viewHolder.itemView.findViewById(R.id.name);
         textView.setText(entry.getLabel());
 
-        ImageView imageView = convertView.findViewById(R.id.icon);
-        imageView.setImageDrawable(entry.getIcon(getContext()));
+        ImageView imageView = viewHolder.itemView.findViewById(R.id.icon);
+        imageView.setImageDrawable(entry.getIcon(context));
 
-        LinearLayout layout = convertView.findViewById(R.id.entry);
+        LinearLayout layout = viewHolder.itemView.findViewById(R.id.entry);
         layout.setOnClickListener(view -> {
-            DesktopIconSelectAppActivity activity = (DesktopIconSelectAppActivity) getContext();
+            DesktopIconSelectAppActivity activity = (DesktopIconSelectAppActivity) context;
             activity.selectApp(entry);
         });
+    }
 
-        return convertView;
+    @Override
+    public int getItemCount() {
+        return entries.size();
     }
 }
\ No newline at end of file
index 12ba155..27ffe0d 100644 (file)
@@ -17,11 +17,13 @@ package com.farmerbb.taskbar.fragment;
 
 import android.os.Bundle;
 import android.support.v4.app.Fragment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ListView;
 
+import com.farmerbb.taskbar.R;
 import com.farmerbb.taskbar.activity.SelectAppActivity;
 
 public class SelectAppFragment extends Fragment {
@@ -43,9 +45,10 @@ public class SelectAppFragment extends Fragment {
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         SelectAppActivity activity = (SelectAppActivity) getActivity();
-        ListView appList = new ListView(activity);
+        RecyclerView appList = (RecyclerView) inflater.inflate(R.layout.tb_recyclerview, container, false);
         int type = getArguments().getInt(ARG_SECTION_NUMBER);
 
+        appList.setLayoutManager(new LinearLayoutManager(getActivity()));
         appList.setAdapter(activity.getAppListAdapter(type));
 
         return appList;
index ac3fda2..9805d17 100644 (file)
@@ -17,7 +17,7 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/entry"
     android:layout_height="wrap_content"
-    android:layout_width="match_parent"
+    android:layout_width="320dp"
     android:paddingLeft="8dp"
     android:paddingRight="8dp"
     android:background="?attr/selectableItemBackground" >
index 8342df5..8c14d7d 100644 (file)
         android:layout_marginBottom="48dp"\r
         android:layout_gravity="center" />\r
 \r
-    <ListView\r
+    <android.support.v7.widget.RecyclerView\r
         android:id="@+id/list"\r
         android:layout_width="match_parent"\r
-        android:layout_height="match_parent" />\r
+        android:layout_height="match_parent"\r
+        android:scrollbars="vertical" />\r
 \r
 </FrameLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/tb_recyclerview.xml b/app/src/main/res/layout/tb_recyclerview.xml
new file mode 100644 (file)
index 0000000..4da78e0
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2019 Braden Farmer
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<android.support.v7.widget.RecyclerView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:scrollbars="vertical" />
\ No newline at end of file
index 0296ec5..38a0920 100644 (file)
@@ -17,7 +17,7 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/entry"
     android:layout_height="wrap_content"
-    android:layout_width="match_parent"
+    android:layout_width="320dp"
     android:paddingLeft="8dp"
     android:paddingRight="8dp"
     android:paddingTop="4dp"
index 7d7d8f6..1eb0ffe 100644 (file)
         android:layout_marginBottom="44dp"
         android:layout_gravity="center" />
 
-    <ListView
+    <android.support.v7.widget.RecyclerView
         android:id="@+id/list"
         android:layout_width="match_parent"
-        android:layout_height="match_parent" />
+        android:layout_height="match_parent"
+        android:scrollbars="vertical" />
 
 </FrameLayout>
\ No newline at end of file