香港专业教育学院implented一个搜索栏到我的ListView和到目前为止,它工作正常,除了 该适配器怪怪的。每次我调用它的清除功能我的列表视图仍显示旧的内容。
公共抽象类MYLISTITEM扩展了BaseAdapter { 民营背景的活动; 私人列表<字符串>数据; 私有静态LayoutInflater吹气= NULL; 私人诠释ItemIcon; 私人布尔moreVis; 公共MYISTITEM(背景信息,INT IconID,布尔VIS){ 活性= A; 数据=新的ArrayList<字符串>(); 充气=(LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); ItemIcon = IconID; moreVis =可见; } 公共无效添加(String对象) { data.add(对象); notifyDataSetChanged(); } 公共无效REPLACE(INT指数,String对象) { 在data.set(索引,对象); notifyDataSetChanged(); } 公共无效清除() { data.clear(); notifyDataSetChanged(); } 公共无效删除(Object对象) { data.remove(对象); notifyDataSetChanged(); } @覆盖 公众诠释getCount将(){ // TODO自动生成方法存根 返回data.size(); } 公共无效插入(String对象,INT C) { 在data.set(C,对象); notifyDataSetChanged(); } @覆盖 公共字符串的getItem(INT位置){ // TODO自动生成方法存根 如果(位置> = 0&功放;&安培;位置< data.size()) { 返回data.get(位置); } 返回null; } @覆盖 众长getItemId(INT位置){ // TODO自动生成方法存根 返回的位置; } 公共静态类ViewHolder { 公共TextView的文字; 公众ImageView的形象; } @覆盖 公共查看getView(INT位置,查看convertView,ViewGroup中父){ 查看VI = convertView; ViewHolder持有人; 如果(convertView == NULL){ VI = inflater.inflate(R.layout.item,父母,假); 持有人=新ViewHolder(); holder.text =(TextView中)vi.findViewById(R.id.text); holder.image =(ImageView的)vi.findViewById(R.id.image); vi.setTag(保持器); } 其他 支架=(ViewHolder)vi.getTag(); holder.text.setText(data.get(位置)); holder.image.setImageDrawable(activity.getResources()getDrawable(ItemIcon)); 的ImageButton btn_more =(的ImageButton)vi.findViewById(R.id.more); 如果(moreVis) { btn_more.setOnClickListener(新OnMoreClickListener(btn_more,位置)); } 其他 { btn_more.setVisibility(View.GONE); } vi.setOnClickListener(新OnRowClickListener(六,位置)); 返回六; } 公共抽象无效OnRowClick(查看MVIEW,INT位置); 公共抽象无效OnMoreClick(查看MVIEW,INT位置); 私有类OnRowClickListener实现OnClickListener { 私人诠释mPosition; 私人查看MView的; OnRowClickListener(查看视图,INT位置){ mPosition =位置; MVIEW =图。 } @覆盖 公共无效的onClick(查看为arg0){ OnRowClick(MVIEW,mPosition); } } 私有类OnMoreClickListener实现OnClickListener { 私人诠释mPosition; 私人查看MView的; OnMoreClickListener(查看视图,INT位置){ mPosition =位置; MVIEW =图。 } @覆盖 公共无效的onClick(查看为arg0){ OnMoreClick(MVIEW,mPosition); } }
}
调试器显示,数据的唯一的大小已被改变,但没有其内容。我怀念的东西在这里???
一些额外的code:
公共抽象类自选扩展的ListView { 公共抽象无效的init(); 公共抽象无效OnLoadFinished(); 公共抽象无效OnRowClicked(INT位); 公共抽象无效onCreateQuickAction(MYQUICKACTION行动,诠释位置); 公共抽象无效CreateOptionMenu(功能菜单); 公共抽象布尔OptionsItemSelected(菜单项项); 公共MYLISTITEM适配器= NULL; 公共静态无效StartupScreen(活动电流,类<>接下来) { 意图myIntent =新的意图(目前,下一个); current.startActivity(myIntent); } 公共自选画面(活动的背景下,INT图标){ 超(上下文); 布尔moreisvis = TRUE; MYQUICKACTION canarybirdybirdy =新MYQUICKACTION(新景(上下文)); onCreateQuickAction(canarybirdybirdy,0); 如果(canarybirdybirdy.anchor.getVisibility()!= View.VISIBLE) { moreisvis = FALSE; } 适配器=新MYLISTITEM(上下文,图标,moreisvis){ @覆盖 公共无效OnRowClick(查看MVIEW,INT位置){ // TODO自动生成方法存根 OnRowClicked(位置); } @覆盖 公共无效OnMoreClick(查看MVIEW,INT位置){ // TODO自动生成方法存根 最后MYQUICKACTION mQuickAction =新MYQUICKACTION(MVIEW); 最后的ImageButton mMoreImage =(的ImageButton)mView.findViewById(MY.views.R.id.more); mMoreImage.setImageResource(MY.views.R.drawable.ic_list_more_selected); onCreateQuickAction(mQuickAction,位置); mQuickAction.setAnimStyle(MYQUICKACTION.ANIM_AUTO); mQuickAction.setOnDismissListener(新OnDismissListener(){ @覆盖 公共无效onDismiss(){ mMoreImage.setImageResource(MY.views.R.drawable.ic_list_more); } }); mQuickAction.show(); } }; 最后ProgressDialog对话框=新ProgressDialog(上下文); dialog.setMessage(载入中...); dialog.show(); 新的Loader(){ @覆盖 公共无效RunThread(){ 在里面(); } @覆盖 公共无效FinishLoad(){ dialog.dismiss(); OnLoadFinished(); } }。开始(); } 公共抽象类MYTHREAD扩展的AsyncTask<虚空,虚空,虚空> { 公共抽象无效InitThread(); 公共抽象无效RunThread(); 公共抽象无效FinishThread(); @覆盖 保护无效doInBackground(虚空...... PARAMS){ RunThread(); // TODO自动生成方法存根 返回null; } // UI的东西允许 @覆盖 在preExecute保护无效(){ InitThread(); } // UI的东西允许 @覆盖 保护无效onProgressUpdate(空...值){ super.onProgressUpdate(值); } // UI的东西允许 @覆盖 保护无效onPostExecute(最终虚空未使用){ FinishThread(); } 公共无效启动() { this.execute(); } } 公共抽象类加载器扩展MYTHREAD { 公共抽象无效FinishLoad(); @覆盖 公共无效InitThread(){ // TODO自动生成方法存根 } @覆盖 公共无效FinishThread(){ // TODO自动生成方法存根 FinishLoad(); } }}和这里的功能,让我headache.Its从自选派生类中的一个,哦,它也被称为从搜索按钮clickevent。
@覆盖 公共无效OnLoadFinished(){ // TODO自动生成方法存根 SelectedTable = TabController.Instance.Clients [TabController.Instance.selectedtab? 1:0] .DbTablename; adapter.clear(); TabController.Instance.Clients [TabController.Instance.selectedtab? 1:0] .MetaEntities(SelectedTable,真,新ClientCallBackHandler(){ @覆盖 公共无效StartCallBack(){ // TODO自动生成方法存根 prgdialog.setMessage(连接服务......); prgdialog.show(); } @覆盖 公共无效EndCallBack(布尔成功){ // TODO自动生成方法存根 如果(成功) { 尝试{ ExceptionResponse除=(ExceptionResponse)this.response; ab.setMessage(Html.fromHtml(&其中b取代;&所述;字体颜色=#FF0000>中+ except.Message)); ab.setPositiveButton(OK,NULL); ab.show(); 成功= FALSE; }赶上(例外五) { MetadataEntitiesResponse RESP =(MetadataEntitiesResponse)响应; 如果(resp.Entities [0]!= NULL) { 耳鼻喉科= resp.Entities [0]; INT I = 0; //搜索我们数据库中的第一个字符串... 对于(AttributeMetaData ATT:Ent.Attributes) { 如果(Att.Type.contentEquals(字符串)) { SelectedAttribute =我; 打破; } 我++; } StartQuery(0); //这里适配器被充满信息 } } } } }); }私人无效StartQuery(INT页) { 如果(当前是!= -1) { 下一页=页面; 返回; } 查询查询=新的Query(); query.EntityName = Ent.Name; 如果(SearchFilter!= NULL) { query.Filter =新的过滤器(); query.Filter.Filters = SearchFilter; query.Filter.FilterOperator = Filter.E_FilterOperator.And; } query.Columns =新AllColumns(); query.Limit =新的限制(); query.Limit.Count = 15; 订购订购=新订单(); order.OrderType = Order.OrderTypeE.Ascending; order.AttributeName = Ent.Attributes [SelectedAttribute] .Name点; query.Orders =新订单[] {为了}; 当前页= query.Limit.Page =页面; TabController.Instance.Clients [TabController.Instance.selectedtab? 1:0] .RetrieveMultiple(查询,新ClientCallBackHandler(){ @覆盖 公共无效StartCallBack(){ // TODO自动生成方法存根 } @覆盖 公共无效EndCallBack(布尔成功){ // TODO自动生成方法存根 尝试{ ExceptionResponse除=(ExceptionResponse)this.response; ab.setMessage(Html.fromHtml(&其中b取代;&所述;字体颜色=#FF0000>中+ except.Message)); ab.setPositiveButton(OK,NULL); ab.show(); 成功= FALSE; }赶上(例外五) { RetrieveMultipleResponse rmResp =(RetrieveMultipleResponse)this.response; 如果(adapter.getCount()== 0) { 的for(int i = 0; I< rmResp.TotalRecords;我++) { prgdialog.setMessage(((int)的(ⅰ/ rmResp.TotalRecords * 100))+%); adapter.add(连接...); } prgdialog.dismiss(); } INT I = 0; 对于(实体耳鼻喉科:rmResp.Entities) { adapter.replace(当前页* 15 + I,ent.Properties [SelectedAttribute]的ToString()); 我++; } 如果(当前页==下一页) { 下一页= -1; } 其他 { StartQuery(下一页); } 当前页= -1; } } }); }
解决方案
我想这code .. 在我们正在创建的CustomListView适配器的OnCreate(),调用一个函数。
adapter.clear();
在CustomListViewAdapter类来创建一个功能明确
公共无效清除(){ // TODO自动生成方法存根 movieItems.clear(); }
在这里movieItems是ListView控件的名称
ive implented a searchbar into my ListView and so far it works correctly except that the adapter is acting weird. Everytime i call its clear function my listview still shows the "old" content.
public abstract class MYLISTITEM extends BaseAdapter { private Context activity; private List<String> data; private static LayoutInflater inflater=null; private int ItemIcon; private boolean moreVis; public MYISTITEM(Context a, int IconID,boolean vis) { activity = a; data = new ArrayList<String>(); inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); ItemIcon = IconID; moreVis = vis; } public void add(String object) { data.add(object); notifyDataSetChanged(); } public void replace(int index,String object) { data.set(index, object); notifyDataSetChanged(); } public void clear() { data.clear(); notifyDataSetChanged(); } public void remove(Object object) { data.remove(object); notifyDataSetChanged(); } @Override public int getCount() { // TODO Auto-generated method stub return data.size(); } public void insert(String object,int c) { data.set(c, object); notifyDataSetChanged(); } @Override public String getItem(int position) { // TODO Auto-generated method stub if(position >= 0 && position < data.size()) { return data.get(position); } return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } public static class ViewHolder{ public TextView text; public ImageView image; } @Override public View getView(int position, View convertView, ViewGroup parent) { View vi=convertView; ViewHolder holder; if(convertView==null){ vi = inflater.inflate(R.layout.item,parent, false); holder=new ViewHolder(); holder.text=(TextView)vi.findViewById(R.id.text); holder.image=(ImageView)vi.findViewById(R.id.image); vi.setTag(holder); } else holder=(ViewHolder)vi.getTag(); holder.text.setText(data.get(position)); holder.image.setImageDrawable(activity.getResources().getDrawable(ItemIcon)); ImageButton btn_more = (ImageButton) vi.findViewById(R.id.more); if(moreVis) { btn_more.setOnClickListener(new OnMoreClickListener(btn_more,position)); } else { btn_more.setVisibility(View.GONE); } vi.setOnClickListener(new OnRowClickListener(vi,position)); return vi; } public abstract void OnRowClick(View mView, int position); public abstract void OnMoreClick(View mView, int position); private class OnRowClickListener implements OnClickListener{ private int mPosition; private View mView; OnRowClickListener(View view,int position){ mPosition = position; mView = view; } @Override public void onClick(View arg0) { OnRowClick(mView,mPosition); } } private class OnMoreClickListener implements OnClickListener{ private int mPosition; private View mView; OnMoreClickListener(View view,int position){ mPosition = position; mView = view; } @Override public void onClick(View arg0) { OnMoreClick(mView,mPosition); } }}
the debugger shows that only the size of data has been changed but none of its content. Do i miss something here???
some additional code:
public abstract class MYSCREEN extends ListView{ public abstract void Init(); public abstract void OnLoadFinished(); public abstract void OnRowClicked(int position); public abstract void onCreateQuickAction(MYQUICKACTION action,int position); public abstract void CreateOptionMenu(Menu menu); public abstract boolean OptionsItemSelected(MenuItem item); public MYLISTITEM adapter = null; public static void StartupScreen(Activity current,Class<?> next) { Intent myIntent = new Intent(current,next); current.startActivity(myIntent); } public MYSCREEN(Activity context,int Icon) { super(context); boolean moreisvis = true; MYQUICKACTION canarybirdybirdy = new MYQUICKACTION(new View(context)); onCreateQuickAction(canarybirdybirdy,0); if(canarybirdybirdy.anchor.getVisibility() != View.VISIBLE) { moreisvis = false; } adapter = new MYLISTITEM(context,Icon,moreisvis){ @Override public void OnRowClick(View mView, int position) { // TODO Auto-generated method stub OnRowClicked(position); } @Override public void OnMoreClick(View mView, int position) { // TODO Auto-generated method stub final MYQUICKACTION mQuickAction = new MYQUICKACTION(mView); final ImageButton mMoreImage = (ImageButton) mView.findViewById(MY.views.R.id.more); mMoreImage.setImageResource(MY.views.R.drawable.ic_list_more_selected); onCreateQuickAction(mQuickAction,position); mQuickAction.setAnimStyle(MYQUICKACTION.ANIM_AUTO); mQuickAction.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss() { mMoreImage.setImageResource(MY.views.R.drawable.ic_list_more); } }); mQuickAction.show(); } }; final ProgressDialog dialog = new ProgressDialog(context); dialog.setMessage("loading..."); dialog.show(); new LOADER(){ @Override public void RunThread() { Init(); } @Override public void FinishLoad() { dialog.dismiss(); OnLoadFinished(); } }.Start(); } public abstract class MYTHREAD extends AsyncTask<Void, Void, Void> { public abstract void InitThread(); public abstract void RunThread(); public abstract void FinishThread(); @Override protected Void doInBackground(Void... params) { RunThread(); // TODO Auto-generated method stub return null; } //ui stuff allowed @Override protected void onPreExecute() { InitThread(); } //ui stuff allowed @Override protected void onProgressUpdate(Void... value) { super.onProgressUpdate(value); } //ui stuff allowed @Override protected void onPostExecute(final Void unused) { FinishThread(); } public void Start() { this.execute(); } } public abstract class LOADER extends MYTHREAD{ public abstract void FinishLoad(); @Override public void InitThread() { // TODO Auto-generated method stub } @Override public void FinishThread() { // TODO Auto-generated method stub FinishLoad(); } }}and here is the function that gives me the headache.Its from one of MYSCREEN derived classes , oh and its also called from the search-buttons clickevent.
@Override public void OnLoadFinished() { // TODO Auto-generated method stub SelectedTable = TabController.Instance.Clients[TabController.Instance.selectedtab ? 1 : 0].DbTablename; adapter.clear(); TabController.Instance.Clients[TabController.Instance.selectedtab ? 1 : 0].MetaEntities(SelectedTable, true, new ClientCallBackHandler(){ @Override public void StartCallBack() { // TODO Auto-generated method stub prgdialog.setMessage("connecting service..."); prgdialog.show(); } @Override public void EndCallBack(boolean success) { // TODO Auto-generated method stub if(success) { try{ ExceptionResponse except = (ExceptionResponse) this.response; ab.setMessage(Html.fromHtml("<b><font color=#ff0000>" + except.Message)); ab.setPositiveButton("ok", null); ab.show(); success = false; }catch(Exception e) { MetadataEntitiesResponse resp = (MetadataEntitiesResponse) response; if(resp.Entities[0] != null) { Ent = resp.Entities[0]; int i = 0; //search for the first string in our database ... for(AttributeMetaData Att : Ent.Attributes) { if(Att.Type.contentEquals("string")) { SelectedAttribute = i; break; } i++; } StartQuery(0); //here the adapter gets filled with info } } } } }); }private void StartQuery(int page) { if(currentpage != -1) { nextpage = page; return; } Query query = new Query(); query.EntityName = Ent.Name; if(SearchFilter != null) { query.Filter = new Filter(); query.Filter.Filters = SearchFilter; query.Filter.FilterOperator = Filter.E_FilterOperator.And; } query.Columns = new AllColumns(); query.Limit = new Limit(); query.Limit.Count = 15; Order order = new Order(); order.OrderType = Order.OrderTypeE.Ascending; order.AttributeName = Ent.Attributes[SelectedAttribute].Name; query.Orders = new Order[] {order}; currentpage = query.Limit.Page = page; TabController.Instance.Clients[TabController.Instance.selectedtab ? 1 : 0].RetrieveMultiple(query, new ClientCallBackHandler(){ @Override public void StartCallBack() { // TODO Auto-generated method stub } @Override public void EndCallBack(boolean success) { // TODO Auto-generated method stub try{ ExceptionResponse except = (ExceptionResponse) this.response; ab.setMessage(Html.fromHtml("<b><font color=#ff0000>" + except.Message)); ab.setPositiveButton("ok", null); ab.show(); success = false; }catch(Exception e) { RetrieveMultipleResponse rmResp = (RetrieveMultipleResponse) this.response; if(adapter.getCount() == 0) { for(int i = 0; i< rmResp.TotalRecords;i++) { prgdialog.setMessage( ((int) (i/rmResp.TotalRecords * 100)) + "%"); adapter.add("connecting..."); } prgdialog.dismiss(); } int i = 0; for(Entity ent : rmResp.Entities) { adapter.replace(currentpage*15+i, ent.Properties[SelectedAttribute].ToString()); i++; } if(currentpage == nextpage) { nextpage = -1; } else { StartQuery(nextpage); } currentpage = -1; } } }); }
解决方案
i tried this code.. in oncreate() of where we are creating the CustomListView Adapter, call a function.
adapter.clear();on the CustomListViewAdapter class create a function as clear
public void clear() { // TODO Auto-generated method stub movieItems.clear(); }where movieItems is the name of the ListView
更多推荐
清除自定义适配器
发布评论