Android Data View Adapters Overview
/Android APIs provide classes and methods to facilitate displaying data in various forms, such as lists, arrays and custom layouts. The graphic below shows how the various classes and methods interact to produce the desired result.
Some examples of coding and use are:
Data
The data to be displayed can be in such forms as an Array, List, File or SQLite database. If a database is used, a Cursor object is also employed. A simple array of String values might be created and converted to an ArrayList like this:
String[] mStringArray = new String[] { "blue", "green", "yellow", "red", "orange", "black", "white", "purple"}; List<String> mList = Arrays.asList(mStringArray); ArrayList<String> mArrayList = new ArrayList<String>(mList);
Cursor
Cursor is an interface that provides random read-write access to the result set returned by a database query. Setting up a Cursor for an SQLite database might look like this:
MySQLiteOpenHelper mDatabaseHelper = new MySQLiteOpenHelper(this); Cursor mCursor = mDatabaseHelper.getDataIntoCursor(); ListView mListView = (ListView) findViewById(R.id.mListView); MyCursorAdapter mCursorAdapter = new MyCursorAdapter(this, mCursor); mListView.setAdapter(mCursorAdapter); class MyCursorAdapter extends CursorAdapter { public MyCursorAdapter(Context context, Cursor c) { super(context, c); } // Implement CursorAdapter bindView method. public void bindView(View view, Context context, Cursor cursor) { String name = cursor.getString(1); TextView textView = (TextView) view; textView.setText(name); } // Implement CursorAdapter newView method. public View newView(Context context, Cursor cursor, ViewGroup parent) { TextView view = new TextView(context); return view; } } private final class MySQLiteOpenHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "myDatabase"; private static final int DATABASE_VERSION = 1; private static final String CREATE_TABLE_TIMELINE = "CREATE TABLE IF NOT EXISTS table_name (_id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar);"; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE_TIMELINE); db.execSQL("INSERT INTO ddd (name) VALUES ('Name1')"); db.execSQL("INSERT INTO ddd (name) VALUES ('Name2')"); db.execSQL("INSERT INTO ddd (name) VALUES ('Name3')"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } public Cursor getDataIntoCursor() { String selectQuery = "SELECT * FROM table_name; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); return cursor; } }
Adapters
An Adapter acts as a bridge between an AdapterView and the underlying data for that view. A custom array adapter defined in Java might look like this:
class MyArrayAdapter extends ArrayAdapter<String> { HashMap<String, Integer> mHashMap = new HashMap<String, Integer>(); public MyArrayAdapter(Context context, int textViewResourceId, List<String> objects) { super(context, textViewResourceId, objects); for (int i = 0; i < objects.size(); ++i) { mHashMap.put(objects.get(i), i); } } @Override public long getItemId(int position) { String item = getItem(position); return mHashMap.get(item); } @Override public boolean hasStableIds() { return true; } }
The custom array adapter mArrayAdapter would be instantiated and linked to a ListView mListView with Java code like this:
setContentView(R.layout.mLayout); final ListView mListView = (ListView) findViewById(R.id.listview); final MyArrayAdapter mArrayAdapter = new MyArrayAdapter(this, android.R.layout.simple_list_item_1, mArrayList); mListView.setAdapter(mArrayAdapter);
AdapterView
An AdapterView is a view whose children are determined by an Adapter. You might use an AdapterView like this:
private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { // Do something in response to the click } }; listView.setOnItemClickListener(mMessageClickedHandler);
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/mLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/mListView" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout>
ViewGroup
ViewGroup is a special view that can contain other views called children. A ViewGroup defined in XML might look like this:
<ViewGroup xmlns:android="http://schemas.android.com/apk/res/android" android:id="@id/mViewGroup" android:layout_height="wrap_content" android:layout_width="fill_parent" > <TextView android:id="@id/mTextView" android:layout_height="wrap_content" android:layout_width="fill_parent" </TextView> </ViewGroup>
Layout
A layout defines the visual structure for a user interface. A layout might look like this:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/mLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/mListView" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout>
Activity
An Activity provides a screen with which users can interact.
public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); . . . } }
public class ArticleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.article_view, container, false); } }