清除自定义适配器 [英] clear a custom adapter

查看:103
本文介绍了清除自定义适配器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

香港专业教育学院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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆