我正在使用Expandable ListView
,其中的数据通过Sqlite
数据库填充。我已经选择从ExpandableListView
删除一个组,它实际上删除了数据库中的相应row
。 但是活动没有刷新,删除的“案例”可见,直到有人返回并再次访问此activity
。
我创建了一个class
extends *BaseExpandableListAdapter*
。它包含所有overridden
方法。以下是代码:
public class ExpandableListAdapterForRunning extends BaseExpandableListAdapter {
private Context _context;
private List<String> _listDataHeader; // header titles
public static List<String> _listDate;
public int index;
// child data in format of header title, child title
private HashMap<String, List<String>> _listDataChild;
public ExpandableListAdapterForRunning(Context context, List<String> listDataHeader,
HashMap<String, List<String>> listChildData,int i,List<String> listDate) {
this._context = context;
this._listDataHeader = listDataHeader;
this._listDataChild = listChildData;
this.index=i;
this._listDate=listDate;
}
@Override
public Object getChild(int groupPosition, int childPosititon) {
return this._listDataChild.get(this._listDataHeader.get(groupPosition))
.get(childPosititon);
}
//other overridden methods
}
现在还有另一个class
RunningCase.java
extends Activity
。此class
用于填充ExpandableListView
中的数据。 OnLongClick()
中的任何群组ExpandableListView
(点按并按住),系统会显示context menu
。 context menu
包含一个删除选项,可以从数据库中删除该案例并刷新RunningCase activity
。
public class RunningCase extends Activity
{
String[] day;
LinearLayout layout_MainMenu;
Case cases;
ExpandableListAdapterForRunning listAdapter;
ExpandableListView expListView;
List<String> listDataHeader;
List<String> listDate;
HashMap<String, List<String>> listDataChild;
Case date;
protected void onCreate(Bundle savedInstanceState) {
prepareListData();
expListView=(ExpandableListView) findViewById(R.id.lvExp);
listAdapter= new ExpandableListAdapterForRunning(this,listDataHeader,listDataChild,i,listDate);
expListView.setAdapter(listAdapter);
registerForContextMenu(expListView);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add("Delete");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
super.onContextItemSelected(item);
final DatabaseHandler dbs = new DatabaseHandler(this);
Cursor c = null;
ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) item
.getMenuInfo();
int type = ExpandableListView.getPackedPositionType(info.packedPosition);
int groupPosition = ExpandableListView.getPackedPositionGroup(info.packedPosition);
if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
String cp=(String) listAdapter.getChild(groupPosition, 0);
caseno=cp.substring(11, cp.length());
}
if(item.getTitle()=="Delete")
{
dbs.deletecase(caseno);
expListView.post(new Runnable() {
public void run() {
listAdapter.notifyDataSetChanged(); //this is not working
}
});
Toast.makeText(this, "The Case has been Deleted.", Toast.LENGTH_LONG).show();
}
return true;
}
//this is the method to populate the expandableListView
public void prepareListData() {
listDataHeader = new ArrayList<String>();
listDate =new ArrayList<String>();
listDataChild = new HashMap<String, List<String>>();
final DatabaseHandler db = new DatabaseHandler(this);
List<Case> cases = db.getRunning();
int i=0;
for (Case cn : cases) {
String str = cn.getPetitioner()+" V/S " + cn.getDefendant();
String caseNo=cn.getCaseNumber();
String caseStage=cn.getCaseStage();
String caseName=cn.getCourtName();
listDataHeader.add(str);
List<String> case2 = new ArrayList<String>();
case2.add("Case No. : "+caseNo);
case2.add("Court Name :"+caseName);
case2.add("Case Stage :"+caseStage);
listDataChild.put(listDataHeader.get(i++), case2);
}
List<Date> date = db.getRunning_child();
for (Date cn : date) {
String str = cn.getNextDate();
listDate.add(str);
}
}
方法db.getRunning()
,db.getRunning_child()
从数据库中检索数据。
此外,以下是从数据库中删除案例的代码,该案例运行正常:
void deletecase(String casenum){
SQLiteDatabase db = this.getWritableDatabase();
String whereClause = "Case_number = ?";
String[] whereArgs = new String[] {
casenum
};
db.delete(TABLE_CASEINFO,whereClause,whereArgs);
db.delete(TABLE_CLIENTINFO,whereClause,whereArgs);
db.delete(TABLE_DATEINFO,whereClause,whereArgs);
Log.d("case deleted","casenum: "+casenum);
db.close(); // Closing database connection
}
请帮帮我。删除案例时应该刷新activity
,以便不再显示已删除的案例。
提前致谢!!
答案 0 :(得分:3)
在致电notfifyDataSetChanged
之前,您应该更新您的私人HashMap&gt;数据。 _listDataChild by setData
方法,由您在适配器上创建。首先设置数据,然后通知。
示例:
public class MyAdapter extends BaseAdapter {
public MyAdapter(...) {
super(...);
}
@Override
public View getView(int position, View view, ViewGroup parent) {
.....
return view;
}
private void setData() {
...
notifyDataSetChanged();
}
}