清除自定义适配器 [英] clear a custom adapter
问题描述
香港专业教育学院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
这篇关于清除自定义适配器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!