Search results layout fixes and list sorting function

This commit is contained in:
Clayton Wilson 2020-09-26 22:56:22 -04:00
parent c30819535b
commit 9d41a3078c
6 changed files with 145 additions and 130 deletions

View File

@ -1,5 +1,4 @@
package com.example.listify; package com.example.listify;
import android.media.Image;
import android.os.Bundle; import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
@ -16,12 +15,14 @@ import com.example.listify.adapter.SearchResultsListAdapter;
import com.example.listify.model.Product; import com.example.listify.model.Product;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator;
import java.util.List; import java.util.List;
public class SearchResults extends AppCompatActivity { public class SearchResults extends AppCompatActivity {
private ListView listView; private ListView listView;
private SearchResultsListAdapter searchResultsListAdapter; private SearchResultsListAdapter searchResultsListAdapter;
private List<Product> productList = new ArrayList<>(); private List<Product> resultsProductList = new ArrayList<>();
private List<Product> resultsProductListFiltered = new ArrayList<>();
@Override @Override
@ -62,12 +63,12 @@ public class SearchResults extends AppCompatActivity {
}); });
listView = (ListView) findViewById(R.id.search_results_list); listView = (ListView) findViewById(R.id.search_results_list);
searchResultsListAdapter = new SearchResultsListAdapter(this, productList); searchResultsListAdapter = new SearchResultsListAdapter(this, resultsProductListFiltered);
listView.setAdapter(searchResultsListAdapter); listView.setAdapter(searchResultsListAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(SearchResults.this, productList.get(position).getItemName(), Toast.LENGTH_SHORT).show(); Toast.makeText(SearchResults.this, resultsProductListFiltered.get(position).getItemName(), Toast.LENGTH_SHORT).show();
} }
}); });
@ -75,9 +76,7 @@ public class SearchResults extends AppCompatActivity {
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override @Override
public boolean onQueryTextSubmit(String query) { public boolean onQueryTextSubmit(String query) {
doSearch(query); doSearch(query);
// TODO: Display the search results listview
return false; return false;
} }
@ -96,23 +95,85 @@ public class SearchResults extends AppCompatActivity {
overridePendingTransition(R.anim.enter_from_right, R.anim.exit_from_right); overridePendingTransition(R.anim.enter_from_right, R.anim.exit_from_right);
} }
// TODO: This function will handle the search operation with the database and return private void doSearch(String query) {
// a listview to caller to be displayed // TODO: Query Database
private ListView doSearch(String query) { // TODO: Create a new Product Object for each result
// Hardcode some search results... // TODO: Add each result to productList
Product a = new Product("Bottled Water", "0000", "Walmart", "0001", "0123456780", "Bro, it's water...", "Grocery", "$13.37", "9/24/2020", "1", "http://3.bp.blogspot.com/-MfroPPQVDKo/UyhUZWqGvkI/AAAAAAAAB-I/DGk622onsvc/s1600/lettuce-b-kool-cat-meme.jpg");
Product b = new Product("Tin Foil", "0001", "Walmart", "0001", "0123456781", "Not aluminum foil", "Grocery", "$1.00", "9/24/2020", "1", "https://i.ytimg.com/vi/q9N1doYMxR0/maxresdefault.jpg");
Product c = new Product("Lettuce", "0002", "Walmart", "0001", "0123456782", "It's still wet", "Grocery", "$0.60", "9/24/2020", "1", "https://www.cattitudedaily.com/wp-content/uploads/2019/12/white-cat-meme-feature.jpg");
Product d = new Product("Video Game", "0003", "Walmart", "0001", "0123456783", "Fun Vidya Gaemz", "Electronics", "$60.00", "9/24/2020", "1", "https://i1.wp.com/bestlifeonline.com/wp-content/uploads/2018/06/cat-meme-67.jpg?resize=1024%2C1024&ssl=1");
Product e = new Product("Mountain Dew", "0004", "Walmart", "0001", "0123456784", "Gamer fuel", "Grocery", "$5.87", "9/24/2020", "1", "https://memeguy.com/photos/images/gaming-cat-7680.png");
Product f = new Product("Tire", "0005", "Walmart", "0001", "0123456785", "30 inch rims", "Automotive", "$146.97", "9/24/2020", "1", "http://cdn.sheknows.com/articles/2013/05/pet5.jpg");
productList.add(a);
productList.add(b);
productList.add(c);
productList.add(d);
productList.add(e);
productList.add(f);
return null; // Hardcode some search results...
for (int i = 0; i < 2; i++) {
Product a = new Product("Bottled Water", "0000", "Walmart", "0001", "0123456780", "Bro, it's water...", "Grocery", 13.37, "9/24/2020", "1", "http://3.bp.blogspot.com/-MfroPPQVDKo/UyhUZWqGvkI/AAAAAAAAB-I/DGk622onsvc/s1600/lettuce-b-kool-cat-meme.jpg");
Product b = new Product("Tin Foil", "0001", "Walmart", "0001", "0123456781", "Not aluminum foil", "Grocery", 1.00, "9/24/2020", "1", "https://i.ytimg.com/vi/q9N1doYMxR0/maxresdefault.jpg");
Product c = new Product("Lettuce", "0002", "Walmart", "0001", "0123456782", "Burger King foot lettuce", "Grocery", 0.60, "9/24/2020", "1", "https://www.cattitudedaily.com/wp-content/uploads/2019/12/white-cat-meme-feature.jpg");
Product d = new Product("Video Game", "0003", "Walmart", "0001", "0123456783", "Fun Vidya Gaemz", "Electronics", 60.00, "9/24/2020", "1", "https://i1.wp.com/bestlifeonline.com/wp-content/uploads/2018/06/cat-meme-67.jpg?resize=1024%2C1024&ssl=1");
Product e = new Product("Mountain Dew", "0004", "Walmart", "0001", "0123456784", "Gamer fuel", "Grocery", 5.87, "9/24/2020", "1", "https://memeguy.com/photos/images/gaming-cat-7680.png");
Product f = new Product("Tire", "0005", "Walmart", "0001", "0123456785", "30 inch rims", "Automotive", 146.97, "9/24/2020", "1", "http://cdn.sheknows.com/articles/2013/05/pet5.jpg");
resultsProductList.add(a);
resultsProductList.add(b);
resultsProductList.add(c);
resultsProductList.add(d);
resultsProductList.add(e);
resultsProductList.add(f);
}
// Add all results to the filtered list
resultsProductListFiltered.addAll(resultsProductList);
}
// Sorts the search results
private void sortResults(int sortMode, boolean descending) {
// Sort Modes
// 0 itemName
// 1 price
// 2 chainName
// 3 upc
// Sort based on mode
switch (sortMode) {
case 0:
resultsProductListFiltered.sort(new Comparator<Product>() {
@Override
public int compare(Product a, Product b) {
return a.getItemName().compareToIgnoreCase(b.getItemName());
}
});
break;
// TODO: May need to change this depending on if price is stored as a string or a double
case 1:
resultsProductListFiltered.sort(new Comparator<Product>() {
@Override
public int compare(Product a, Product b) {
return (int)(a.getPrice() - b.getPrice());
}
});
break;
case 2:
resultsProductListFiltered.sort(new Comparator<Product>() {
@Override
public int compare(Product a, Product b) {
return a.getChainName().compareToIgnoreCase(b.getChainName());
}
});
break;
case 3:
resultsProductListFiltered.sort(new Comparator<Product>() {
@Override
public int compare(Product a, Product b) {
return a.getUpc().compareToIgnoreCase(b.getUpc());
}
});
break;
}
if (descending) {
for (int i = 0; i < resultsProductListFiltered.size() / 2; i++) {
Product temp = resultsProductListFiltered.get(i);
resultsProductListFiltered.set(i, resultsProductListFiltered.get(resultsProductListFiltered.size() - i - 1));
resultsProductListFiltered.set(resultsProductListFiltered.size() - i - 1, temp);
}
}
} }
} }

View File

@ -44,21 +44,22 @@ public class SearchResultsListAdapter extends BaseAdapter {
public View getView(int position, View convertView, ViewGroup parent) { public View getView(int position, View convertView, ViewGroup parent) {
if (inflater == null) { if (inflater == null) {
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}if(convertView == null){ }
if (convertView == null) {
convertView = inflater.inflate(R.layout.search_list_item, null); convertView = inflater.inflate(R.layout.search_list_item, null);
} }
ImageView productImage = (ImageView) convertView.findViewById(R.id.item_image); ImageView productImage = (ImageView) convertView.findViewById(R.id.item_image);
TextView itemName = (TextView) convertView.findViewById(R.id.item_name); TextView itemName = (TextView) convertView.findViewById(R.id.item_name);
TextView description = (TextView) convertView.findViewById(R.id.item_desc);
TextView price = (TextView) convertView.findViewById(R.id.item_price); TextView price = (TextView) convertView.findViewById(R.id.item_price);
TextView itemStore = (TextView) convertView.findViewById(R.id.item_store);
Product product = productList.get(position); Product product = productList.get(position);
// product.loadImageView(0, 0, productImage); // TODO: If image url is broken, display @drawable/ic_baseline_broken_image_600.xml
Glide.with(activity).load(product.getImageUrl()).into(productImage); Glide.with(activity).load(product.getImageUrl()).into(productImage);
itemName.setText(product.getItemName()); itemName.setText(product.getItemName());
description.setText(product.getDescription()); price.setText(String.format("$%.2f", product.getPrice()));
price.setText(product.getPrice()); itemStore.setText(product.getChainName());
return convertView; return convertView;
} }

View File

@ -1,17 +1,5 @@
package com.example.listify.model; package com.example.listify.model;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.ImageView;
import com.example.listify.R;
import java.io.InputStream;
public class Product { public class Product {
private String itemName; private String itemName;
private String itemId; private String itemId;
@ -20,7 +8,7 @@ public class Product {
private String upc; private String upc;
private String description; private String description;
private String department; private String department;
private String price; private double price;
private String retrievedDate; private String retrievedDate;
private String fetchCounts; private String fetchCounts;
private String imageUrl; private String imageUrl;
@ -28,7 +16,7 @@ public class Product {
public Product() {} public Product() {}
public Product(String itemName, String itemId, String chainName, String chainId, String upc, public Product(String itemName, String itemId, String chainName, String chainId, String upc,
String description, String department, String price, String retrievedDate, String description, String department, double price, String retrievedDate,
String fetchCounts, String imageUrl) { String fetchCounts, String imageUrl) {
this.itemName = itemName; this.itemName = itemName;
this.itemId = itemId; this.itemId = itemId;
@ -43,36 +31,6 @@ public class Product {
this.imageUrl = imageUrl; this.imageUrl = imageUrl;
} }
// private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
// ImageView imageView;
//
// public DownloadImageTask(ImageView imageView) {
// this.imageView = imageView;
// }
//
// protected Bitmap doInBackground(String... args) {
// String url = args[0];
// Bitmap image = null;
// try {
// InputStream in = new java.net.URL(url).openStream();
// image = BitmapFactory.decodeStream(in);
// } catch (Exception e) {
// Log.e("Error", e.getMessage());
// e.printStackTrace();
// }
// return image;
// }
//
// protected void onPostExecute(Bitmap result) {
// // Return the broken image icon as a bitmap if the url is invalid
// if (result == null) {
// imageView.setImageResource(R.drawable.ic_baseline_broken_image_600);
// } else {
// imageView.setImageBitmap(result);
// }
// }
// }
public String getItemName() { public String getItemName() {
return itemName; return itemName;
} }
@ -129,11 +87,11 @@ public class Product {
this.department = department; this.department = department;
} }
public String getPrice() { public double getPrice() {
return price; return price;
} }
public void setPrice(String price) { public void setPrice(double price) {
this.price = price; this.price = price;
} }
@ -160,9 +118,4 @@ public class Product {
public void setImageUrl(String imageUrl) { public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl; this.imageUrl = imageUrl;
} }
// // TODO: Need to implement image resizing
// public void loadImageView(int height, int width, ImageView imageView) {
// new DownloadImageTask(imageView).execute(this.imageUrl);
// }
} }

View File

@ -18,7 +18,5 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:divider="@color/list_divider" android:divider="@color/list_divider"
android:dividerHeight="1dp"/> android:dividerHeight="1dp"/>
<!-- android:listSelector="@drawable/list_row_selector"-->
<!-- />-->
</RelativeLayout> </RelativeLayout>

View File

@ -9,64 +9,64 @@
<ImageView <ImageView
android:id="@+id/item_image" android:id="@+id/item_image"
android:layout_width="60dp" android:layout_width="80dp"
android:layout_height="40dp" android:layout_height="80dp"
android:src="@drawable/ic_baseline_broken_image_600" android:src="@drawable/ic_baseline_broken_image_600"
android:contentDescription="@string/item_image_desc"
android:layout_alignTop="@+id/linearLayout" android:layout_alignTop="@+id/linearLayout"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/> android:layout_alignParentStart="true"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:id="@+id/linearLayout">
</LinearLayout>
<TextView <TextView
android:id="@+id/item_name" android:id="@+id/item_name"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textAllCaps="true" android:layout_marginStart="14dp"
android:layout_centerHorizontal="true" android:layout_toEndOf="@+id/item_image"
android:text="" android:textStyle="bold"
android:textSize="15dp" android:textSize="15sp"
android:layout_centerInParent="true"
android:gravity="center"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:id="@+id/linearLayout">
<TextView
android:id="@+id/item_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:text="" /> android:text="" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true">
<TextView
android:id="@+id/item_price_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Price: "
android:textSize="12sp"
android:textStyle="bold" />
<TextView <TextView
android:id="@+id/item_price" android:id="@+id/item_price"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:paddingTop="20dp"
android:textSize="12sp" android:textSize="12sp"
android:layout_toEndOf="@+id/item_image"
android:text=""/> android:text=""/>
<!-- Only displays if the item is cheaper at another store -->
<TextView
android:id="@+id/cheaper_price_alert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:textColor="#FF0000"
android:layout_marginStart="14dp"
android:paddingTop="35dp"
android:text=""
android:layout_toEndOf="@+id/item_image"
/>
</LinearLayout> <TextView
android:id="@+id/item_store"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textSize="12sp"
android:textStyle="bold"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"/>
</RelativeLayout> </RelativeLayout>

View File

@ -14,6 +14,8 @@
<string name="app_label">Listify</string> <string name="app_label">Listify</string>
<string name="search_hint">Search Test</string> <string name="search_hint">Search Test</string>
<string name="title_activity_search">SearchActivity</string> <string name="title_activity_search">SearchActivity</string>
<string name="item_image_desc">Product Image</string>
<!-- Strings used for fragments for navigation --> <!-- Strings used for fragments for navigation -->
<string name="first_fragment_label">First Fragment</string> <string name="first_fragment_label">First Fragment</string>
<string name="second_fragment_label">Second Fragment</string> <string name="second_fragment_label">Second Fragment</string>