android – notifyDataSetChanged()不刷新可扩展列表视图
作者:互联网
我正在使用Expandable ListView,其中的数据通过Sqlite数据库填充.我已经选择从ExpandableListView中删除一个组,它实际上删除了数据库中的相应行.但是活动不会刷新,删除的“案例”是可见的,直到有人返回并重新参加此活动.
我创建了一个扩展* BaseExpandableListAdapter *的类.它包含所有重写的方法.以下是代码:
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
}
现在有另一个类RunningCase.java扩展了Activity.此类用于填充ExpandableListView中的数据.在ExpandableListView中的任何组的OnLongClick()(点击并按住)中,将出现一个上下文菜单.上下文菜单包含一个选项Delete,用于从数据库中删除该案例并刷新RunningCase活动.
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
}
请帮帮我.删除案例时应刷新活动,以便不再显示已删除的案例.
提前致谢!!
解决方法:
在调用notfifyDataSetChanged之前,您应该更新您的私有HashMap>数据. _listDataChild是由您在适配器上创建的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();
}
}
标签:android,expandablelistview,notifydatasetchanged 来源: https://codeday.me/bug/20190703/1365444.html