Android UI How to - ListView with TextView as cell renderer








The following code shows how to create a ListView with TextView as cell renderer.

Example

res/values/string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="footer">This is a demo of the ListView. Click and hold on to one of the items above to show the context menu.</string>
    <string name="app_name">ListViewDemo</string>
  <string-array name="countries">
    <item>Sweden</item>
    <item>Norway</item>
    <item>Finland</item>
    <item>Denmark</item>
    <item>Germany</item>
    <item>Poland</item>
    <item>Netherlands</item>
    <item>Belgium</item>
  </string-array>
  <string-array name="menu">
    <item>Edit</item>
    <item>Delete</item>
    <item>Send</item>
  </string-array>
</resources>

Main layout file

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    >
    <ListView
    android:id="@+id/list"  
      android:layout_width="fill_parent" 
      android:layout_height="0px"
      android:layout_weight="1"
      />
  <TextView
    android:id="@+id/footer"  
      android:layout_width="fill_parent" 
      android:layout_height="60dip"
      android:text="@string/footer"
      android:padding="4dip"
      android:background="#FF666666"
      />
</LinearLayout>

res/layout/listitem.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:textSize="24dip"
  android:padding="8dip"
  >
</TextView>

Java code

import java.util.Arrays;

import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class ListViewDemoActivity extends Activity {
  private String[] Countries;
  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Countries = getResources().getStringArray(R.array.countries);
        Arrays.sort(Countries);
        
    ListView list = (ListView)findViewById(R.id.list);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listitem, Countries);
    list.setAdapter(adapter);
    registerForContextMenu(list);
    }
    
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
      if (v.getId()==R.id.list) {
          AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
        menu.setHeaderTitle(Countries[info.position]);
        String[] menuItems = getResources().getStringArray(R.array.menu); 
        for (int i = 0; i<menuItems.length; i++) {
          menu.add(Menu.NONE, i, i, menuItems[i]);
      }
      }
    }
    
    @Override
    public boolean onContextItemSelected(MenuItem item) {
      AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
      int menuItemIndex = item.getItemId();
    String[] menuItems = getResources().getStringArray(R.array.menu);
    String menuItemName = menuItems[menuItemIndex];
      String listItemName = Countries[info.position];
      
      TextView text = (TextView)findViewById(R.id.footer);
      text.setText(String.format("Selected %s for item %s", menuItemName, listItemName));
      return true;
    }
}