From 4b67d2b8560e0bf36f91bc490362a1b40473ee52 Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Fri, 25 Oct 2019 00:12:00 +0200 Subject: [PATCH] Replace apps filter ListView with RecycleView --- .../emanuelef/remote_capture/AppAdapter.java | 73 +++++++++---------- .../emanuelef/remote_capture/AppsView.java | 21 +++--- .../remote_capture/MainActivity.java | 7 +- 3 files changed, 51 insertions(+), 50 deletions(-) diff --git a/app/src/main/java/com/emanuelef/remote_capture/AppAdapter.java b/app/src/main/java/com/emanuelef/remote_capture/AppAdapter.java index 545b4275..24367ace 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/AppAdapter.java +++ b/app/src/main/java/com/emanuelef/remote_capture/AppAdapter.java @@ -23,61 +23,58 @@ import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + import java.util.List; -public class AppAdapter extends BaseAdapter { +public class AppAdapter extends RecyclerView.Adapter { private LayoutInflater layoutInflater; private List listStorage; + private View.OnClickListener mListener; - AppAdapter(Context context, List customizedListView) { - layoutInflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + AppAdapter(Context context, List customizedListView, final View.OnClickListener listener) { + layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); listStorage = customizedListView; + mListener = listener; + } + + @NonNull + @Override + public AppAdapter.AppViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.installed_app_list, parent, false); + AppViewHolder recyclerViewHolder = new AppViewHolder(view); + view.setOnClickListener(mListener); + + return(recyclerViewHolder); } @Override - public int getCount() { + public void onBindViewHolder(@NonNull AppViewHolder holder, int position) { + holder.textInListView.setText(listStorage.get(position).getName()); + holder.imageInListView.setImageDrawable(listStorage.get(position).getIcon()); + holder.packageInListView.setText(listStorage.get(position).getPackages()); + } + + @Override + public int getItemCount() { return listStorage.size(); } - @Override - public Object getItem(int position) { - return listStorage.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - - ViewHolder listViewHolder; - if(convertView == null){ - listViewHolder = new ViewHolder(); - convertView = layoutInflater.inflate(R.layout.installed_app_list, parent, false); - - listViewHolder.textInListView = convertView.findViewById(R.id.list_app_name); - listViewHolder.imageInListView = convertView.findViewById(R.id.app_icon); - listViewHolder.packageInListView= convertView.findViewById(R.id.app_package); - convertView.setTag(listViewHolder); - }else{ - listViewHolder = (ViewHolder)convertView.getTag(); - } - listViewHolder.textInListView.setText(listStorage.get(position).getName()); - listViewHolder.imageInListView.setImageDrawable(listStorage.get(position).getIcon()); - listViewHolder.packageInListView.setText(listStorage.get(position).getPackages()); - - return convertView; - } - - class ViewHolder{ + public static class AppViewHolder extends RecyclerView.ViewHolder { TextView textInListView; ImageView imageInListView; TextView packageInListView; + + public AppViewHolder(View view) { + super(view); + + textInListView = view.findViewById(R.id.list_app_name); + imageInListView = view.findViewById(R.id.app_icon); + packageInListView= view.findViewById(R.id.app_package); + } } } diff --git a/app/src/main/java/com/emanuelef/remote_capture/AppsView.java b/app/src/main/java/com/emanuelef/remote_capture/AppsView.java index 6073561e..763f1e8b 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/AppsView.java +++ b/app/src/main/java/com/emanuelef/remote_capture/AppsView.java @@ -2,15 +2,16 @@ package com.emanuelef.remote_capture; import android.content.Context; import android.view.View; -import android.widget.AdapterView; -import android.widget.ListView; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import java.util.List; // TODO add searchbar // https://stackoverflow.com/questions/31085086/how-to-implement-floating-searchwidget-android -class AppsView extends ListView { +class AppsView extends RecyclerView { List mInstalledApps; public interface OnSelectedAppListener { @@ -21,18 +22,20 @@ class AppsView extends ListView { super(context); mInstalledApps = installedApps; - AppAdapter installedAppAdapter = new AppAdapter(getContext(), mInstalledApps); - - setAdapter(installedAppAdapter); + setLayoutManager(new LinearLayoutManager(context)); + setHasFixedSize(true); } public void setSelectedAppListener(final OnSelectedAppListener listener) { - setOnItemClickListener(new AdapterView.OnItemClickListener() { + AppAdapter installedAppAdapter = new AppAdapter(getContext(), mInstalledApps, new OnClickListener() { @Override - public void onItemClick(AdapterView adapterView, View view, int i, long l) { - AppDescriptor app = ((AppDescriptor) getAdapter().getItem(i)); + public void onClick(View view) { + int itemPosition = getChildLayoutPosition(view); + AppDescriptor app = mInstalledApps.get(itemPosition); listener.onSelectedApp(app); } }); + + setAdapter(installedAppAdapter); } } diff --git a/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java b/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java index 5f2c0bb4..ec43b75d 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java @@ -160,19 +160,20 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa return; } + mOpenAppsWhenDone = false; + AppsView apps = new AppsView(this, mInstalledApps); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.app_filter); builder.setView(apps); - mOpenAppsWhenDone = false; - final AlertDialog alert = builder.create(); apps.setSelectedAppListener(new AppsView.OnSelectedAppListener() { @Override public void onSelectedApp(AppDescriptor app) { mFilterUid = app.getUid(); - mMenu.getItem(0).setIcon(app.getIcon()); + // clone the drawable to avoid a "zoom-in" effect when clicked + mMenu.getItem(0).setIcon(app.getIcon().getConstantState().newDrawable()); // dismiss the dialog alert.cancel();