使用内容观察者刷新可扩展列表(Android)
我有一个可扩展列表,带有一个自定义适配器、两个光标(来自基本可扩展列表适配器)和一个内容提供者 现在,我的主要目标是在插入带有意图调用的活动的新数据后,刷新这个可扩展列表。我正在尝试一个内容观察者,但没有成功,因为没有刷新 我把相关的代码(我想)。多谢各位使用内容观察者刷新可扩展列表(Android),android,refresh,android-contentprovider,contentobserver,Android,Refresh,Android Contentprovider,Contentobserver,我有一个可扩展列表,带有一个自定义适配器、两个光标(来自基本可扩展列表适配器)和一个内容提供者 现在,我的主要目标是在插入带有意图调用的活动的新数据后,刷新这个可扩展列表。我正在尝试一个内容观察者,但没有成功,因为没有刷新 我把相关的代码(我想)。多谢各位 public class ActPlacesManagement extends Activity{ private static final int DELETE_ID = Menu.FIRST; private static final
public class ActPlacesManagement extends Activity{
private static final int DELETE_ID = Menu.FIRST;
private static final String TAG = null;
public Cursor mPlacesCursor;
public Cursor mBoxesCursor;
ExpandableListView lstCategorias;
AdpPlacesManagement adapter;
String message, message1, message2;
String novo_local, nova_caixa;
Button btnNewPlace, btnNewBox;
Handler handler;
private static final String[] PROJECTION_PLACES = new String[] {
ProvPersonalArchive.KEY_ROWID_PLACES,
ProvPersonalArchive.KEY_DESIG_PLACES,
};
private static final String[] PROJECTION_BOXES = new String[] {
ProvPersonalArchive.KEY_ROWID_BOXES,
ProvPersonalArchive.KEY_DESIG_BOXES,
ProvPersonalArchive.KEY_PLACE_BOXES,
};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_places_management);
mPlacesCursor = getContentResolver().query(ProvPersonalArchive.CONTENT_URI_PLACES,
PROJECTION_PLACES, null, null, null);
mBoxesCursor = getContentResolver().query(ProvPersonalArchive.CONTENT_URI_BOXES,
PROJECTION_BOXES, null, null, null);
lstCategorias = (ExpandableListView)this.findViewById(R.id.expandableGestaoCategorias);
adapter = new AdpPlacesManagement(this, mPlacesCursor, mBoxesCursor, this);
lstCategorias.setAdapter(adapter);
lstCategorias.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
return lstCategorias_onGroupClick(parent, v, groupPosition, id);
}
});
lstCategorias.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
return lstCategorias_onChildClick(parent, v, groupPosition, childPosition, id);
}
});
btnNewPlace = (Button)this.findViewById(R.act_gestao_categorias.novo_lugar);
btnNewBox = (Button)this.findViewById(R.act_gestao_categorias.nova_caixa);
btnNewPlace.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btnNewPlace_onClick(v);
}
});
btnNewBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btnNewBox_onClick(v);
}
});
registerForContextMenu(lstCategorias);
mPlacesCursor.registerContentObserver(new ObsPersonalArchive(handler));
mBoxesCursor.registerContentObserver(new ObsPersonalArchive(handler));
}
// Eventos da lista de locais e caixas
public boolean lstCategorias_onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
return false;
}
public boolean lstCategorias_onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
return false;
}
// Termina a actividade e volta à ActInicial, levando o local
public void finish() {
// Prepare data intent
Intent data = new Intent();
setResult(RESULT_OK, data);
data.putExtra("local", message);
// Activity finished ok, return the data
super.finish();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.act_start, menu);
return true;
}
// Eventos dos botões para criar novo local e caixa
public void btnNewPlace_onClick(View view) {
Intent intent = new Intent(this, ActNewPlace.class);
startActivityForResult(intent, 1);
}
public void btnNewBox_onClick(View view) {
Intent intent = new Intent(this, ActNewBox.class);
startActivityForResult(intent, 2);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && requestCode == 1) {
if (data.hasExtra("novo_local") && data.hasExtra("nova_caixa")) {
// Chama o método para gravar o local na base de dados
Toast.makeText(this, "New place created!", Toast.LENGTH_LONG).show();
}
}
if (resultCode == RESULT_OK && requestCode == 2) {
if (data.hasExtra("novo_local") && data.hasExtra("nova_caixa")) {
String novo_local = data.getExtras().getString("novo_local");
String nova_caixa = data.getExtras().getString("nova_caixa");
Toast.makeText(this, novo_local + nova_caixa, Toast.LENGTH_LONG).show();
}
}
}
public class ObsPersonalArchive extends ContentObserver {
public ObsPersonalArchive(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
}
}
}
迈克尔,我写的新班级:
import android.app.Activity;
import android.content.Intent;
import android.database.ContentObserver;
import android.database.Cursor;
import android.database.DataSetObserver;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.Button;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.Toast;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
public class ActPlacesManagement extends FragmentActivity
implements LoaderManager.LoaderCallbacks<Cursor>{
private static final int DELETE_ID = Menu.FIRST;
private static final String TAG = null;
public Cursor mPlacesCursor;
public Cursor mBoxesCursor;
ExpandableListView lstCategorias;
AdpPlacesManagement adapter;
String message, message1, message2;
String novo_local, nova_caixa;
Button btnNewPlace, btnNewBox;
Handler handler;
LoaderManager loaderManager = getSupportLoaderManager();
private static final String[] PROJECTION_PLACES = new String[] {
ProvPersonalArchive.KEY_ROWID_PLACES, // 0
ProvPersonalArchive.KEY_DESIG_PLACES, // 1
};
private static final String[] PROJECTION_BOXES = new String[] {
ProvPersonalArchive.KEY_ROWID_BOXES, // 0
ProvPersonalArchive.KEY_DESIG_BOXES, // 1
ProvPersonalArchive.KEY_PLACE_BOXES, // 2
};
private static final int PLACES_LOADER = 1;
private static final int BOXES_LOADER = 2;
private LoaderManager.LoaderCallbacks<Cursor> mCallbacks;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_places_management);
mPlacesCursor = getContentResolver().query(ProvPersonalArchive.CONTENT_URI_PLACES,
PROJECTION_PLACES, null, null, null);
mBoxesCursor = getContentResolver().query(ProvPersonalArchive.CONTENT_URI_BOXES,
PROJECTION_BOXES, null, null, null);
// Lista de locais e caixas
lstCategorias = (ExpandableListView)this.findViewById(R.id.expandableGestaoCategorias);
adapter = new AdpPlacesManagement(this, mPlacesCursor, mBoxesCursor, this);
lstCategorias.setAdapter(adapter);
lstCategorias.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
return lstCategorias_onGroupClick(parent, v, groupPosition, id);
}
});
lstCategorias.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
return lstCategorias_onChildClick(parent, v, groupPosition, childPosition, id);
}
});
// Botões para novo lugar e caixa
btnNewPlace = (Button)this.findViewById(R.act_gestao_categorias.novo_lugar);
btnNewBox = (Button)this.findViewById(R.act_gestao_categorias.nova_caixa);
btnNewPlace.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btnNewPlace_onClick(v);
}
});
btnNewBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btnNewBox_onClick(v);
}
});
registerForContextMenu(lstCategorias);
getSupportLoaderManager().initLoader(BOXES_LOADER, null, mCallbacks);
getSupportLoaderManager().initLoader(PLACES_LOADER, null, mCallbacks);
}
// Eventos da lista de locais e caixas
public boolean lstCategorias_onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
return false;
}
public boolean lstCategorias_onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
return false;
}
public void finish() {
Intent data = new Intent();
setResult(RESULT_OK, data);
data.putExtra("local", message);
super.finish();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.act_start, menu);
return true;
}
// Eventos dos botões para criar novo local e caixa
public void btnNewPlace_onClick(View view) {
Intent intent = new Intent(this, ActNewPlace.class);
startActivityForResult(intent, 1);
}
public void btnNewBox_onClick(View view) {
Intent intent = new Intent(this, ActNewBox.class);
startActivityForResult(intent, 2);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && requestCode == 1) {
if (data.hasExtra("novo_local") && data.hasExtra("nova_caixa")) {
Toast.makeText(this, "New place created!", Toast.LENGTH_LONG).show();
}
}
if (resultCode == RESULT_OK && requestCode == 2) {
if (data.hasExtra("novo_local") && data.hasExtra("nova_caixa")) {
String novo_local = data.getExtras().getString("novo_local");
String nova_caixa = data.getExtras().getString("nova_caixa");
Toast.makeText(this, novo_local + nova_caixa, Toast.LENGTH_LONG).show();
}
}
}
// Menu de contexto
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
ExpandableListView.ExpandableListContextMenuInfo info;
try {
// Casts the incoming data object into the type for AdapterView objects.
info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;
} catch (ClassCastException e) {
// If the menu object can't be cast, logs an error.
Log.e(TAG, "bad menuInfo", e);
return;
}
int place = ExpandableListView.getPackedPositionGroup(info.packedPosition);
int box = ExpandableListView.getPackedPositionChild(info.packedPosition);
int tipo_clic = ExpandableListView.getPackedPositionType(info.packedPosition);
String titulo = null;
if (tipo_clic == ExpandableListView.PACKED_POSITION_TYPE_CHILD){
titulo = (String) adapter.getChild(place, box);
menu.add(0, DELETE_ID, 0, R.string.delete_box);
}
if (tipo_clic == ExpandableListView.PACKED_POSITION_TYPE_GROUP){
titulo = (String) adapter.getGroup(place);
menu.add(0, DELETE_ID, 0, R.string.delete_place);
}
if (titulo == null) {
// For some reason the requested item isn't available, do nothing
return;
}
menu.setHeaderTitle(titulo);
}
public boolean onContextItemSelected(MenuItem item) {
ExpandableListView.ExpandableListContextMenuInfo info =
(ExpandableListView.ExpandableListContextMenuInfo) item.getMenuInfo();
int tipo_clic = ExpandableListView.getPackedPositionType(info.packedPosition);
switch(item.getItemId()) {
case DELETE_ID:
if (tipo_clic == ExpandableListView.PACKED_POSITION_TYPE_CHILD){
Toast.makeText(this, "The box was deleted", Toast.LENGTH_LONG).show();
}
if (tipo_clic == ExpandableListView.PACKED_POSITION_TYPE_GROUP){
Toast.makeText(this, "The place was deleted", Toast.LENGTH_LONG).show();
}
return true;
}
return super.onContextItemSelected(item);
}
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
CursorLoader cursorLoader = new CursorLoader(getBaseContext());
if (id == BOXES_LOADER){
cursorLoader = new CursorLoader(ActPlacesManagement.this,
ProvPersonalArchive.CONTENT_URI_BOXES, PROJECTION_BOXES, null, null, null);
};
if (id == PLACES_LOADER){
cursorLoader = new CursorLoader(ActPlacesManagement.this,
ProvPersonalArchive.CONTENT_URI_PLACES, PROJECTION_PLACES, null, null, null);
};
return cursorLoader;
}
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
switch (loader.getId()) {
case BOXES_LOADER:
mPlacesCursor = cursor;
break;
case PLACES_LOADER:
mBoxesCursor = cursor;
break;
}
adapter = new AdpPlacesManagement(this, mPlacesCursor, mBoxesCursor, this);
lstCategorias.setAdapter(adapter);
}
public void onLoaderReset(Loader<Cursor> loader) {
switch (loader.getId()) {
case BOXES_LOADER:
mPlacesCursor = null;
break;
case PLACES_LOADER:
mBoxesCursor = null;
break;
}
adapter = new AdpPlacesManagement(this, mPlacesCursor, mBoxesCursor, this);
}
public class ObsPersonalArchive extends ContentObserver {
public ObsPersonalArchive(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
}
}
}
导入android.app.Activity;
导入android.content.Intent;
导入android.database.ContentObserver;
导入android.database.Cursor;
导入android.database.DataSetObserver;
导入android.net.Uri;
导入android.os.Bundle;
导入android.os.Handler;
导入android.util.Log;
导入android.view.ContextMenu;
导入android.view.Menu;
导入android.view.MenuInflater;
导入android.view.MenuItem;
导入android.view.view;
导入android.view.ContextMenu.ContextMenuInfo;
导入android.widget.Button;
导入android.widget.ExpandableListAdapter;
导入android.widget.ExpandableListView;
导入android.widget.Toast;
导入android.support.v4.app.FragmentActivity;
导入android.support.v4.app.LoaderManager;
导入android.support.v4.content.CursorLoader;
导入android.support.v4.content.Loader;
导入android.support.v4.widget.CursorAdapter;
公共类ActPlacesManagement扩展了碎片活动
实现LoaderManager.LoaderCallbacks{
private static final int DELETE_ID=Menu.FIRST;
私有静态最终字符串标记=null;
公共光标标记器;
公共光标mBoxesCursor;
可扩展列表视图;
ADP管理适配器;
字符串消息,消息1,消息2;
字符串novo_local,nova_caixa;
按钮btnNewPlace,btnNewBox;
处理者;
LoaderManager LoaderManager=getSupportLoaderManager();
私有静态最终字符串[]投影位置=新字符串[]{
ProvPersonalArchive.KEY\u ROWID\u位置,//0
ProvPersonalArchive.KEY\u DESIG\u位置,//1
};
私有静态最终字符串[]投影盒=新字符串[]{
ProvPersonalArchive.KEY\u ROWID\u框,//0
ProvPersonalArchive.KEY\u设计框,//1
ProvPersonalArchive.KEY\u PLACE\u框,//2
};
私有静态最终整数位置_LOADER=1;
专用静态最终整型箱_LOADER=2;
私有LoaderManager.LoaderCallbacks McCallbacks;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.act\u places\u management);
mPlacesCursor=getContentResolver().query(ProvPersonalArchive.CONTENT\u URI\u位置,
投影位置,空,空,空);
mBoxesCursor=getContentResolver().query(ProvPersonalArchive.CONTENT\u URI\u框,
投影框,空,空,空);
//莱斯塔·德洛凯·凯克斯酒店
lstCategorias=(ExpandableListView)this.findViewById(R.id.expandableGestaoCategorias);
适配器=新的AdpPlacesManagement(this,mplacescrsor,mBoxesCursor,this);
lstCategorias.setAdapter(适配器);
lstCategorias.setOnGroupClickListener(新的ExpandableListView.OnGroupClickListener(){
@凌驾
公共布尔值onGroupClick(ExpandableListView父视图,视图v,
int groupPosition,长id){
返回lstCategorias\u onGroupClick(父项、v、组位置、id);
}
});
setOnChildClickListener(新的ExpandableListView.OnChildClickListener(){
@凌驾
公共布尔onChildClick(ExpandableListView父视图,视图v,
int groupPosition、int childPosition、long id){
返回lstCategorias_onChildClick(父级、v、groupPosition、childPosition、id);
}
});
//新卢加和凯萨酒店
btnNewPlace=(按钮)this.findViewById(R.act\u gestao\u categorias.novo\u lugar);
btnNewBox=(按钮)this.findViewById(R.act\u gestao\u categorias.nova\u caixa);
btnNewPlace.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
btnNewPlace_onClick(v);
}
});
btnNewBox.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Btnewbox_onClick(v);
}
});
registerForContextMenu(lstCategorias);
getSupportLoaderManager();
getSupportLoaderManager().initLoader(PLACES_LOADER,null,mCallbacks);
}
//当地和凯克斯事件
公共布尔lstCategorias\u onGroup单击(ExpandableListView父视图,视图v,
int groupPosition,长id){
返回false;
}
公共布尔lstCategorias_onChildClick(ExpandableListView父视图,视图v,
int groupPosition、int childPosition、long id){
返回false;
}
public void finish(){
意向数据=新意向();
设置结果(结果正常,数据);
data.putExtra(“本地”,消息);
super.finish();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
MenuInflater充气机=getMenuInflater();
充气机。充气(右菜单。动作开始,菜单);
返回true;
}
//新喀里多尼亚和卡伊萨的社区活动
公共无效btnNewPlace_onClick(视图){
Intent Intent=新Intent(this,ActNewPlace.class);
startActivityForResult(意向,1);
}
公共无效Btnewbox_onClick(视图){
Intent Intent=新Intent(这个,ActNewBox.class);
startActivityForResult(意向书,2);
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
if(resultCode==RESULT\u OK&&requestCode==1){
if(data.hasExtra(“novo_local”)&data.hasExtra(“nova_caixa”)){
Toast.makeText(这是“新创建的地方!”,Toast.LENGTH_LONG.show();
}
}
if(resultCode==RESULT\u OK&&requestCode==2){
if(data.hasExtra(“novo_local”)&data.hasExtra(“nova_caixa”)){
字符串novo_local=data.getExtras().getString(“novo_local”);
字符串nova_caixa=data.getExtras().g
LoaderManager.LoaderCallbacks<Cursor> mLoaderCallback = new LoaderManager.LoaderCallbacks<Cursor>() {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoader loader = new CursorLoader(context);
loader.setProjection(args.getStringArray("projection"));
loader.setSelection(args.getString("selection"));
loader.setSelectionArgs(args.getStringArray("selectionArgs"));
loader.setUri(Uri.parse(args.getString("uri")));
return loader;
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
if (cursor == null) {
return;
}
YourListAdapter adapter = (YourListAdapter) getListAdapter();
adapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
YourListAdapter adapter = (YourListAdapter) getListAdapter();
adapter.swapCursor(null);
}
};
/* Calling a loader sample. */
Bundle loaderArgs = new Bundle();
loaderArgs.putString("uri", URI);
loaderArgs.putStringArray("projection", PROJECTION);
LoaderManager loaderManager = getLoaderManager();
loaderManager.initLoader(YOUR_LOADER_ID, loaderArgs, mYourLoaderCallback);