gpt4 book ai didi

android - notifyDataSetChanged() 不刷新可扩展 ListView

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:55:50 25 4
gpt4 key购买 nike

我正在使用 Expandable ListView,其中的数据是通过 Sqlite 数据库填充的。我提供了从 ExpandableListView 中删除一个组的选项,它实际上删除了数据库中相应的 row但是该 Activity 不会刷新并且删除的“案例”是可见的,直到返回并再次回到此 Activity 我创建了一个,它扩展*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。此 用于填充ExpandableListView 中的数据。 OnLongClick()(点击并按住)ExpandableListView 中的任何组,将出现一个上下文菜单上下文菜单 包含一个选项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 之前,您应该通过您在适配器上创建的 setData 方法更新您的私有(private) HashMap> _listDataChild 数据。先设置数据,再通知。

例子:

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 - notifyDataSetChanged() 不刷新可扩展 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22405188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com