Android CursorAdapter com layout personalizado e como usá-lo

O Android fornece classes de adaptador especificamente para exibir dados de uma consulta de banco de dados SQLite. Existe a classe SimpleCursorAdapter, que é mais simples e você não pode usar seu próprio layout xml personalizado e não tem o controle do layout. Para usar o layout xml personalizado, o Android fornece o CursorAdapter.

Um CursorAdapter facilita o uso quando o recurso de um listview vem do banco de dados e você pode ter mais controle sobre a vinculação de valores de dados a controles de layout. No método newView (), você simplesmente aumenta a visualização e a retorna. No método bindView (), você define os elementos de sua visualização.

1) CursorAdapter

Criar nova classe

Primeiro, crie uma nova classe que estenda CursorAdapter e dê um nome a ela. Esta nova classe CursorAdapter deve implementar os métodos abstratos herdados da seguinte forma

public class MyCursorAdapter extends CursorAdapter {

// Default constructor
public MyCursorAdapter(Context context, Cursor cursor, int flags) {
...
}

public void bindView(View view, Context context, Cursor cursor) {
...
}

public View newView(Context context, Cursor cursor, ViewGroup parent) {
...
return null;
}
}

Em seguida, defina os métodos de MyCursorAdapter

No BaseAdapter, a visualização é criada no método getView; em CursorAdapter, entretanto, a visualização é criada no método newView () e os elementos são preenchidos em bindView (). No método newView (), você simplesmente aumenta a visualização de seu xml personalizado e o retorna. No método bindView (), você define os elementos de sua visualização.
Aqui está o código:

public class MyCursorAdapter extends CursorAdapter {
private LayoutInflater cursorInflater;

// Default constructor
public MyCursorAdapter(Context context, Cursor cursor, int flags) {
super(context, c, flags);
cursorInflater
= (LayoutInflater) context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
...
}

public void bindView(View view, Context context, Cursor cursor) {
TextView textViewTitle = (TextView) view.findViewById(R.id.articleTitle);
String title = cursor.getString( cursor.getColumnIndex( MyTable.COLUMN_TITLE ) )
textViewTitle
.setText(title);
...
}

public View newView(Context context, Cursor cursor, ViewGroup parent) {
// R.layout.list_row is your xml layout for each row
return cursorInflater.inflate(R.layout.list_row, parent, false);
}
}

2) Classe MainActivity

Configuração da atividade principal

Visto que carregar dados do banco de dados é um trabalho pesado, carregaremos os dados no Thread. Se você não iniciar explicitamente o CursorAdapter em seu próprio encadeamento, ele será executado no encadeamento principal (UI), que pode ser percebido como instável ou lento para responder pela interface dos usuários. Aqui, usaremos o Android Handler

public class MainActivity extends Activity {
MyCursorAdapter customAdapter;
private Cursor mCursor;
private ListView listView;

// Default constructor
public onCreate(Bundle savedInstanceState) {
...
listView
= (ListView) findViewById(R.id.main_layout);

// Your database schema
String[] mProjection = {
MyTable.COLUMN_ID,
MyTable.COLUMN_TITLE,
};

// Here we query database
mCursor
= getContentResolver().query(
MyAdContentProvider.CONTENT_URI,
mProjection
,
null,
null,
null);


listView
.setOnItemClickListener(new OnItemClickListener() {
...
}):
}

new Handler().post(new Runnable() {

@Override
public void run() {
customAdapter
= new MyCursorAdapter(
MainActivity.this,
mCursor
,
0);

listView
.setAdapter(customAdapter);
}

});

}