Project description: show a Product ListView and when click at sort icon in header listview, PopupWindow like a dropdownlist appears and show some sorting options (name, price,...).
Now, launching eclipse and start an android project!
In order to show PopupWindow as a dropdown list, we must combine it with an sub listview and every listview element is displayed in a PopupWindow row interface.
This is code for show PopupWindow method:
/**
* handle header listview onclick event
*/
private OnClickListener showPopupWindow() {
return new OnClickListener() {
@Override
public void onClick(View v) {
PopupWindow popUp = popupWindowsort();
popUp.showAsDropDown(v, 0, 0); // show popup like dropdown list
}
};
}
/**
* show popup window method reuturn PopupWindow
*/
private PopupWindow popupWindowsort() {
// initialize a pop up window type
popupWindow = new PopupWindow(this);
ArrayList<String> sortList = new ArrayList<String>();
sortList.add("A to Z");
sortList.add("Z to A");
sortList.add("Low to high price");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line,
sortList);
// the drop down list is a list view
ListView listViewSort = new ListView(this);
// set our adapter and pass our pop up window contents
listViewSort.setAdapter(adapter);
// set on item selected
listViewSort.setOnItemClickListener(onItemClickListener());
// some other visual settings for popup window
popupWindow.setFocusable(true);
popupWindow.setWidth(250);
// popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.white));
popupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
// set the listview as popup content
popupWindow.setContentView(listViewSort);
return popupWindow;
}
Handling sorting Listview element onclick event (sorting main Listview data):
private OnItemClickListener onItemClickListener() {
return new OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
if (position == 0) {
sortByName(products);
adapter.notifyDataSetChanged();
} else if (position == 1) {
reverseByName(products);
adapter.notifyDataSetChanged();
} else {
sortByPrice(products);
adapter.notifyDataSetChanged();
Log.i(TAG, "position2 " + position);
}
dismissPopup();
}
};
}
Full MainActivity.java source code (with all sorting methods):
public class MainActivity extends Activity {
private ListView listView;
private View headerListView;
private PopupWindow popupWindow;
private ArrayList<Product> products;
private ListViewAdapter adapter;
private final String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.list);
setListViewHeader();
setListViewAdapter();
createProductList();
}
private void setListViewHeader() {
LayoutInflater inflater = getLayoutInflater();
ViewGroup header = (ViewGroup) inflater.inflate(R.layout.header_listview, listView, false);
listView.addHeaderView(header, null, false);
headerListView = (ImageView) findViewById(R.id.sort);
// show popup window when click sort icon
// in listview header
headerListView.setOnClickListener(showPopupWindow());
}
private void createProductList() {
products.add(new Product(R.drawable.bag, "Travel Bag", "1000"));
products.add(new Product(R.drawable.calculator, "Casio calculator", "500"));
products.add(new Product(R.drawable.camera, "Canon Camera", "6000"));
products.add(new Product(R.drawable.clock, "Alarm Clock", "500"));
products.add(new Product(R.drawable.book, "Gone with the wind", "300"));
products.add(new Product(R.drawable.computer, "Acer Laptop", "6000"));
products.add(new Product(R.drawable.fashion, "T shirt", "200"));
products.add(new Product(R.drawable.food, "Cake", "50"));
products.add(new Product(R.drawable.movie, "Saw", "20"));
products.add(new Product(R.drawable.shoe, "Adidas shoe", "2500"));
products.add(new Product(R.drawable.travel, "2 day toure", "1500"));
products.add(new Product(R.drawable.usb, "Kingston Usb", "10"));
adapter.notifyDataSetChanged();
}
private void setListViewAdapter() {
products = new ArrayList<Product>();
adapter = new ListViewAdapter(this, R.layout.item_listview, products);
listView.setAdapter(adapter);
}
/**
* handle header listview onclick event
*/
private OnClickListener showPopupWindow() {
return new OnClickListener() {
@Override
public void onClick(View v) {
PopupWindow popUp = popupWindowsort();
popUp.showAsDropDown(v, 0, 0); // show popup like dropdown list
}
};
}
/**
* show popup window method reuturn PopupWindow
*/
private PopupWindow popupWindowsort() {
// initialize a pop up window type
popupWindow = new PopupWindow(this);
ArrayList<String> sortList = new ArrayList<String>();
sortList.add("A to Z");
sortList.add("Z to A");
sortList.add("Low to high price");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line,
sortList);
// the drop down list is a list view
ListView listViewSort = new ListView(this);
// set our adapter and pass our pop up window contents
listViewSort.setAdapter(adapter);
// set on item selected
listViewSort.setOnItemClickListener(onItemClickListener());
// some other visual settings for popup window
popupWindow.setFocusable(true);
popupWindow.setWidth(250);
// popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.white));
popupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
// set the list view as pop up window content
popupWindow.setContentView(listViewSort);
return popupWindow;
}
private OnItemClickListener onItemClickListener() {
return new OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
if (position == 0) {
sortByName(products);
adapter.notifyDataSetChanged();
} else if (position == 1) {
reverseByName(products);
adapter.notifyDataSetChanged();
} else {
sortByPrice(products);
adapter.notifyDataSetChanged();
Log.i(TAG, "position2 " + position);
}
dismissPopup();
}
};
}
private void dismissPopup() {
if (popupWindow != null) {
popupWindow.dismiss();
}
}
/**
* sort products by name A - Z
*/
private void sortByName(ArrayList<Product> productList) {
Collections.sort(productList, new Comparator<Product>() {
public int compare(Product v1, Product v2) {
return v1.getName().compareTo(v2.getName());
}
});
}
/**
* sort produts by name Z - A
*/
private void reverseByName(ArrayList<Product> productList) {
Collections.sort(productList, Collections.reverseOrder(new Comparator<Product>() {
@Override
public int compare(Product lhs, Product rhs) {
return lhs.getName().compareTo(rhs.getName());
}
}));
}
/**
* sort products by price (low to high)
*
* @param productList
*/
private void sortByPrice(ArrayList<Product> productList) {
Collections.sort(productList, new PriceComparator());
}
private static class PriceComparator implements Comparator<Product> {
public int compare(Product c1, Product c2) {
return Integer.valueOf(c1.getPrice()).compareTo(Integer.valueOf(c2.getPrice()));
}
}
}
This activity layout (activity_main.xml) simple like this: Therefor, we must create a Custom Listview Adapter base on ArrayAdapter.
Source code for ListviewAdapter.java:
public class ListViewAdapter extends ArrayAdapter<Product> {
private Activity activity;
private ArrayList<Product> products;
private final String TAG = ListViewAdapter.class.getSimpleName();
public ListViewAdapter(Activity activity, int resource, ArrayList<Product> products) {
super(activity, resource, products);
this.activity = activity;
this.products = products;
Log.i(TAG, "init adapter");
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
// inflate layout from xml
LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
// If holder not exist then locate all view from UI file.
if (convertView == null) {
// inflate UI from XML file
convertView = inflater.inflate(R.layout.item_listview, parent, false);
// get all UI view
holder = new ViewHolder(convertView);
// set tag for holder
convertView.setTag(holder);
} else {
// if holder created, get tag from view
holder = (ViewHolder) convertView.getTag();
}
Product product = products.get(position);
// set product data to views
holder.image.setImageResource(product.getImageId());
holder.name.setText(product.getName());
holder.price.setText(product.getPrice());
// the view must be returned to our activity
return convertView;
}
private class ViewHolder {
private ImageView image;
private TextView name;
private TextView price;
public ViewHolder(View v) {
image = (ImageView) v.findViewById(R.id.image);
name = (TextView) v.findViewById(R.id.name);
price = (TextView) v.findViewById(R.id.price);
}
}
}
Finally, these are some necessary layout:
- Listview header layout (header_listview.xml): - Layour for every main Listview item(item_listview.xml): Finally, running program and we will see this result (click each image for full screen):
![]() |
![]() |
![]() |
(sorry for ads in download link)



