Custom ListView with ImageView

It's a custom ListView example, using custom adapter. Each row in the ListView have a ImageView and a TextView.


/res/layout/row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<ImageView
android:id="@+id/rowImageView"
android:layout_gravity="center"
android:layout_width="48dp"
android:layout_height="48dp" />

<TextView
android:id="@+id/rowTextView"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>

/res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.example.androidimageviewlist.MainActivity" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:autoLink="web"
android:text="http://android-er.blogspot.com/"
android:textStyle="bold" />
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout>

MainActivity.java
package com.example.androidimageviewlist;

import java.util.ArrayList;
import java.util.List;

import android.support.v7.app.ActionBarActivity;
import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

public class Item {
Drawable ItemDrawable;
String ItemString;
Item(Drawable drawable, String t){
ItemDrawable = drawable;
ItemString = t;
}
}

static class ViewHolder {
ImageView icon;
TextView text;
}

public class ItemsListAdapter extends BaseAdapter {

private Context context;
private List<Item> list;

ItemsListAdapter(Context c, List<Item> l){
context = c;
list = l;
}

@Override
public int getCount() {
return list.size();
}

@Override
public Object getItem(int position) {
return list.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;

// reuse views
if (rowView == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
rowView = inflater.inflate(R.layout.row, null);

ViewHolder viewHolder = new ViewHolder();
viewHolder.icon = (ImageView) rowView.findViewById(R.id.rowImageView);
viewHolder.text = (TextView) rowView.findViewById(R.id.rowTextView);
rowView.setTag(viewHolder);
}

ViewHolder holder = (ViewHolder) rowView.getTag();
holder.icon.setImageDrawable(list.get(position).ItemDrawable);
holder.text.setText(list.get(position).ItemString);

return rowView;
}
}

List<Item> items;
ListView listView;
ItemsListAdapter myItemsListAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.listview);

initItems();
myItemsListAdapter = new ItemsListAdapter(this, items);
listView.setAdapter(myItemsListAdapter);

listView.setOnItemClickListener(new OnItemClickListener(){

@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Toast.makeText(MainActivity.this,
((Item)(parent.getItemAtPosition(position))).ItemString,
Toast.LENGTH_LONG).show();
}});

}

private void initItems(){
items = new ArrayList<Item>();

TypedArray arrayDrawable = getResources().obtainTypedArray(R.array.resicon);
TypedArray arrayText = getResources().obtainTypedArray(R.array.restext);

for(int i=0; i<arrayDrawable.length(); i++){
Drawable d = arrayDrawable.getDrawable(i);
String s = arrayText.getString(i);
Item item = new Item(d, s);
items.add(item);
}

arrayDrawable.recycle();
arrayText.recycle();
}

}

/res/values/arrays.xml, used to load the List.
<?xml version="1.0" encoding="utf-8"?>
<resources>

<array name="resicon">
<item>@android:drawable/ic_dialog_alert</item>
<item>@android:drawable/ic_dialog_dialer</item>
<item>@android:drawable/ic_dialog_email</item>
<item>@android:drawable/ic_dialog_info</item>
<item>@android:drawable/ic_dialog_map</item>
<item>@android:drawable/ic_menu_camera</item>
<item>@android:drawable/ic_menu_compass</item>
<item>@android:drawable/ic_menu_gallery</item>
<item>@android:drawable/ic_menu_my_calendar</item>
<item>@android:drawable/ic_menu_myplaces</item>
<item>@android:drawable/ic_menu_slideshow</item>
<item>@android:drawable/ic_menu_today</item>
</array>
<array name="restext">
<item>"alert"</item>
<item>"dialer"</item>
<item>"email"</item>
<item>"info"</item>
<item>"map"</item>
<item>"camera"</item>
<item>"compass"</item>
<item>"gallery"</item>
<item>"calendar"</item>
<item>"myplaces"</item>
<item>"slideshow"</item>
<item>"today"</item>
</array>

</resources>

download filesDownload the files.

Next:
Add/Remove items to custom ListView programmatically
Drag and Drop items between ListView
Improved Drag and Drop items between ListView
Drag and Drop items between ListView, with OnDragListener on ListView cells
Drag and Drop between ListView and GridView