Android fragments 在自定义适配器中更改数据库时刷新列表和适配器
我的项目是todo 我有4个选项卡,4个片段和4个列表(Actionbar导航包含4个选项卡和ViewPager)。 4列表(选项卡)使用相同的db表,但每个表使用categoryID检索不同的数据。 我使用一个Asynctask来读取数据并将适配器设置为listAndroid fragments 在自定义适配器中更改数据库时刷新列表和适配器,android-fragments,Android Fragments,我的项目是todo 我有4个选项卡,4个片段和4个列表(Actionbar导航包含4个选项卡和ViewPager)。 4列表(选项卡)使用相同的db表,但每个表使用categoryID检索不同的数据。 我使用一个Asynctask来读取数据并将适配器设置为list public class AsyncTaskDB extends AsyncTask<Void, Void, listAdapter> { Context act; int Categoryid; ArrayList&l
public class AsyncTaskDB extends AsyncTask<Void, Void, listAdapter> {
Context act;
int Categoryid;
ArrayList<memo> arraymemo;
listAdapter myadapter;
ListView list;
listAdapter listAdp;
public AsyncTaskDB(Context acti, int categoryID) {
this.act = acti;
this.Categoryid = categoryID;
}
@Override
protected listAdapter doInBackground(Void... params) {
MemoDBHelper helper = new MemoDBHelper(act);
// getAllDataByCategoryID
if (Categoryid != CategoryID.Done_ID)
arraymemo = helper.getAllTaskByCategory(Categoryid);
else
arraymemo = (ArrayList<memo>) helper.gatDoneMemo();
myadapter = new listAdapter(act, arraymemo);
if (myadapter == null) {
Toast.makeText(act, "no data", Toast.LENGTH_SHORT).show();
cancel(true);
}
return myadapter;
}
@Override
protected void onPostExecute(listAdapter result) {
switch (Categoryid) {
case CategoryID.Urgent_Imprtant_ID:
list = (ListView) ((Activity) act)
.findViewById(R.id.Urgent_Important_list);
break;
case CategoryID.Urgent_Less_Imprtant_ID:
list = (ListView) ((Activity) act)
.findViewById(R.id.Urgent_Less_Important_list);
break;
case CategoryID.Less_Urgent_Imprtant_ID:
list = (ListView) ((Activity) act)
.findViewById(R.id.Less_Urgent_Imprtant_list);
break;
case CategoryID.Neither_Urgent_Or_Imprtant_ID:
list = (ListView) ((Activity) act)
.findViewById(R.id.Neither_Urgent_Imprtant_list);
break;
case CategoryID.Done_ID:
list = (ListView) ((Activity) act).findViewById(R.id.ArchiveList);
break;
}
list.setAdapter(result);
this.listAdp = result;
}
public listAdapter getlistAdapter() {
return this.listAdp;
}
公共类AsyncTaskDB扩展了AsyncTask{
上下文行为;
int分类;
ArrayList arraymemo;
列表适配器myadapter;
列表视图列表;
listAdapter listAdp;
公共AsyncTaskDB(上下文活动,int categoryID){
this.act=acti;
this.Categoryid=Categoryid;
}
@凌驾
受保护的listAdapter doInBackground(无效…参数){
MemoDBHelper=新的MemoDBHelper(act);
//getAllDataByCategoryID
if(Categoryid!=Categoryid.Done\u ID)
arraymemo=helper.getAllTaskByCategory(Categoryid);
其他的
arraymemo=(ArrayList)helper.gatdoneMo();
myadapter=新的listAdapter(act,arraymemo);
如果(myadapter==null){
Toast.makeText(act,“无数据”,Toast.LENGTH_SHORT).show();
取消(真);
}
返回myadapter;
}
@凌驾
受保护的void onPostExecute(listAdapter结果){
开关(类别ID){
案件类别紧急\重要\身份证:
列表=(列表视图)((活动)法案)
.findViewById(R.id.紧急/重要列表);
打破
案件类别:紧急\次要\重要\ ID:
列表=(列表视图)((活动)法案)
.findViewById(R.id.紧急/不太重要/列表);
打破
案件类别不太紧急重要身份证:
列表=(列表视图)((活动)法案)
.findViewById(R.id.Less\u emergency\u important\u list);
打破
案件类别。既不是紧急案件,也不是重要案件:
列表=(列表视图)((活动)法案)
.findViewById(R.id.既非紧急也非重要列表);
打破
案例类别ID.Done\U ID:
列表=(列表视图)((活动)法案).findViewById(R.id.ArchiveList);
打破
}
list.setAdapter(结果);
this.listapp=结果;
}
公共listAdapter getlistAdapter(){
返回此.listapp;
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RQS_MoveTo) {
if (resultCode == Result.RESULT_OK) {
int id = data.getExtras().getInt("NEWCategoryID");
MemoDBHelper helper = new MemoDBHelper(getActivity());
final int[] myitemsid = getSelectedID();
for (int j = 0; j < myitemsid.length; j++) {
helper.updateCategory(myitemsid[j], id);
}
onResume();
}
}
}
列表中的每个备忘都有“完成”复选框。当用户选中并取消选中它时,会在数据库中自动更新备忘。(在自定义适配器中)
----------------------------
| -- |
|| |备忘录标题|
| -- |
----------------------------
公共类listAdapter扩展BaseAdapter实现OnCheckedChangeListener{Context act;
数组列表;
Sparseboolean阵列mcheck;
int pos;
记忆助手;
公共listAdapter(上下文活动,ArrayList memoarray){
这个动作=活动;
this.memorarray=memorarray;
mcheck=newsparsebooleanarray(memorarray.size());
helper=新的MemoDBHelper(act);
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回memorary.size();
}
@凌驾
公共备忘录项目(内部位置){
//TODO自动生成的方法存根
返回数组。获取(位置);
}
@凌驾
公共长getItemId(int arg0){
//TODO自动生成的方法存根
返回0;
}
公共类视图持有者{
文本视图标题;
//文本视图描述;
复选框chkstatus;
}
持票人;
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
pos=位置;
LayoutInflater in=((活动)act.getLayoutInflater();
if(convertView==null){
convertView=in.充气(R.layout.list_项,空);
它=新的viewHolder();
it.title=(TextView)convertView.findViewById(R.id.txt\u list\u title);
it.chkstatus=(复选框)convertView
.findviewbyd(R.id.chkStatusid);
convertView.setTag(it);
}否则{
it=(viewHolder)convertView.getTag();
}
it.title.setText(memorarray.get(position.GetTitle());
setChecked(memorary.get(position.GetSattus());
it.chkstatus.setOnCheckedChangeListener(this);
setTag(String.valueOf(memorary.get(position.GetID());
返回视图;
}
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
mcheck.put(Integer.valueOf((String)buttonView.getTag()),已检查);
helper.updateStatusByID(Integer.valueOf((String)buttonView.getTag()),
(被检查);
helper.close();
//db updatedt后,调用片段中的方法notifydatsetchanged!
UrgentImportant_frg.notifyAdapter();
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RQS_MoveTo) {
if (resultCode == Result.RESULT_OK) {
int id = data.getExtras().getInt("NEWCategoryID");
MemoDBHelper helper = new MemoDBHelper(getActivity());
final int[] myitemsid = getSelectedID();
for (int j = 0; j < myitemsid.length; j++) {
helper.updateCategory(myitemsid[j], id);
}
onResume();
}
}
}
适配器必须通知已更改的数据,并且列表不显示已完成的备忘。我不知道如何做!
我的第一个片段:
public class UrgentImportant_frg extends Fragment {
static listAdapter myadp;
ListView list;
// memo selectedmemo;
long[] checkid;
AsyncTaskDB asyn;
ArrayList<memo> selectedMemoArray;
final static int RQS_MoveTo = 10;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootview = inflater.inflate(R.layout.urgentimportant_layout,
container, false);
return rootview;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
selectedMemoArray = new ArrayList<memo>();
list.setMultiChoiceModeListener(new MultiChoiceModeListener() {
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
// list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.list_select_menu, menu);
/*
* MenuInflater inflater = getActivity().getMenuInflater();
* inflater.inflate(R.menu.list_select_menu, menu);
*/
mode.setTitle("Select Items");
return true;
}
@Override
public boolean onActionItemClicked(final ActionMode mode,
MenuItem item) {
switch (item.getItemId()) {
case R.id.deletemenu:
final int[] myitemsid = getSelectedID();
final MemoDBHelper helper = new MemoDBHelper(getActivity());
AlertDialog.Builder myAlert = new AlertDialog.Builder(
getActivity());
myAlert.setMessage(
"Are you sure to delete " + myitemsid.length
+ " memo ?")
.setPositiveButton("yes", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
for (int j = 0; j < myitemsid.length; j++) {
helper.deleteRow(myitemsid[j]);
/*
* if (j == myitemsid.length - 1) {
* strid[j] = String
* .valueOf(myitemsid[j]); } else {
* strid[j] = String
* .valueOf(myitemsid[j]) + ","; }
*/
}
mode.finish();
onResume();
}
}).setNegativeButton("no", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
mode.finish();
}
});
AlertDialog alert = myAlert.create();
alert.show();
// mode.finish();
break;
case R.id.MoveTomenu:
// myadp.getItem(position);
Intent i = new Intent(getActivity(),
MoveToCategory_act.class);
i.putExtra("categoryid", CategoryID.Urgent_Imprtant_ID);
startActivityForResult(i, RQS_MoveTo);
mode.finish();
break;
}
return true;
}
// get selected id to delete and move category
@Override
public void onItemCheckedStateChanged(ActionMode mode,
int position, long id, boolean checked) {
if (myadp == null) {
myadp = asyn.getlistAdapter();
}
int p = ifMemoSelectedBefore(myadp.getItem(position));
if (p != -1) {
selectedMemoArray.remove(p);
} else if (checked) {
selectedMemoArray.add(myadp.getItem(position));
}
final int checkedCount = list.getCheckedItemCount();
switch (checkedCount) {
case 0:
mode.setSubtitle(null);
break;
case 1:
mode.setSubtitle("One Item Selected");
break;
default:
mode.setSubtitle(checkedCount + " Item Selected");
break;
}
}
});
getActivity().getActionBar().setSubtitle("subtitle");
}
public int ifMemoSelectedBefore(memo m) {
return selectedMemoArray.indexOf(m);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onViewCreated(view, savedInstanceState);
list = (ListView) view.findViewById(R.id.Urgent_Important_list);
// -------------click item
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
if (myadp == null) {
myadp = asyn.getlistAdapter();
}
// Log.d("tag", myadp.getItem(position).GetTitle() + "");
Intent nextintent = new Intent(getActivity(),
EditMemo_act.class);
memo g = myadp.getItem(position);
/*
* MemoDBHelper helper = new MemoDBHelper(getActivity());
* helper.updateStatusByID(g.GetID(), true);
*/
nextintent.putExtra("editmemo", g);
startActivity(nextintent);
}
});
}
@Override
public void onResume() {
asyn = new AsyncTaskDB(getActivity(), CategoryID.Urgent_Imprtant_ID);
asyn.execute();
super.onResume();
}
public int[] getSelectedID() {
int[] SelectedArray_ID = new int[selectedMemoArray.size()];
for (int j = 0; j < selectedMemoArray.size(); j++) {
SelectedArray_ID[j] = selectedMemoArray.get(j).GetID();
// Log.d("id", selectedMemoArray.get(j).GetID() + "");
}
return SelectedArray_ID;
}
public class UrgentImportant\u frg扩展片段{
静态列表适配器myadp;
列表视图列表;
//备忘录选择emo;
长[]校验ID;
异步任务数据库asyn;
ArrayList SelectedMemorArray;
最终静态整数RQS_MoveTo=10;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.urgent重要的\u布局,
货柜(虚假);;
返回rootview;
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
list.setChoiceMode(ListView.CHOICE\u MODE\u MULTIPLE\u model);
selectedMemoArray=newArrayList();
list.setMultichoiceModelListener(新的MultichoiceModelListener(){
@凌驾
公共布尔onPrepareActionMode(操作模式,菜单){
返回true;
}
@凌驾
公共void onDestroyActionMode(ActionMode模式){
//list.setChoiceMode(ListView.CHOICE\u MODE\u MULTIPLE\u model);
}
@凌驾
公共布尔onCreateActionMode(ActionMode模式,菜单){
mode.getMenuInflater().充气(R.menu.list\u select\u菜单,菜单);
/*
*MenuInflater充气器=getActivity()。getMenuInflater();
*充气机。充气(右菜单。列表\选择\菜单,菜单);
*/
mode.setTitle(
notifyDataSetChanged();