notificationDataSetChanged() 不刷新可扩展列表视图

2024-04-07

我在用Expandable ListView其中的数据通过填充Sqlite数据库。我已经提供了从中删除群组的选项ExpandableListView它实际上删除了相应的row在数据库中。但是该活动不会刷新,并且删除的“案例”是可见的,直到人们返回并再次出现此情况activity.我创建了一个class that 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 which extends Activity. This class用于填充数据ExpandableListView. OnLongClick()(点击并按住)任何组ExpandableListView, a context menu出现。这context menu包含一个选项Delete从数据库中删除该案例并刷新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删除案例时应该刷新,以便删除的案例不再出现。 提前致谢!!


致电之前notfifyDataSetChanged您应该更新私有 HashMap> _listDataChild 的数据setData您在适配器上创建的方法。先设置数据,再通知。

Example:

public class MyAdapter extends BaseAdapter {

public MyAdapter(...) {
    super(...);
}

@Override
public View getView(int position, View view, ViewGroup parent) {
    .....
    return view;

}

private void setData() {
    ...
   notifyDataSetChanged();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

notificationDataSetChanged() 不刷新可扩展列表视图 的相关文章

随机推荐