Android的ListView控件随着切换按钮Web服务 [英] Android ListView With Toggle Button Web Service

查看:136
本文介绍了Android的ListView控件随着切换按钮Web服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题是, onCheckedChange()方法得到多次打电话和手机内存用完。当我走上的AsyncTask 调用了 checkedChange 方法,它工作正常。或者,如果我把 setChecked()召唤出它正常工作为好。但我要在那里有这些方法的应用意义的这一部分。在的WebService 呼叫超短但必须从切换按钮切换。

我想给大家分享一些您的想法和意见。

 私有类ItemAdapter扩展ArrayAdapter< FavItem> {        私人最终的ArrayList< FavItem>猫;
        公众诠释计数;        //私人上下文米;
        公共ItemAdapter(上下文的背景下,INT textViewResourceId,
                ArrayList的< FavItem> myItems){
            超(背景下,textViewResourceId,myItems);
            this.cats = myItems;
            // this.m =背景;
        }        @覆盖
        公共查看getView(INT位置,查看convertView,父母的ViewGroup){
            视图V = convertView;            如果(V == NULL){
                LayoutInflater VI =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                // LayoutInflater VI = getLayoutInflater();
                V = vi.inflate(R.layout.favitem,NULL);
            }
            最后FavItem O = cats.get(位置);
            如果(O!= NULL){                TextView的标题=(TextView中)v.findViewById(R.id.textViewNear1);
                TextView的子=(TextView中)v.findViewById(R.id.textViewNear2);
                最后切换按钮文本=(切换按钮)V
                        .findViewById(R.id.texttoggle);
                最后切换按钮电子邮件=(切换按钮)V
                        .findViewById(R.id.emailtoggle);
                text.setChecked(o.getFav_sms()== 1真?假的);
                email.setChecked(o.getFav_email()== 1真:假的?);
                title.setText(o.getBusiness_name());
                sub.setText(o.getDeal_name());                text.setOnCheckedChangeListener(新OnCheckedChangeListener(){                    @覆盖
                    公共无效onCheckedChanged(CompoundButton CTEXT,
                            布尔textCheck){
                        算上++;
                        INT uText = text.isChecked()? 1:0;
                        INT uEmail = email.isChecked()? 1:2;
                        INT ID = o.getObject_id();
                        字符串catURL =htt​​ps://example.com/?fn=myfavs&a=add&ot=2&oid=
                                + ID +&放大器; F1 =+ uText +&放大器; F2 =+ uEmail;
                        UpdateFavs U =新UpdateFavs();
                        u.execute(catURL);
                        日志(URL+ catURL);                        LOG(算:+计数);
                    }
                });
                email.setOnCheckedChangeListener(新OnCheckedChangeListener(){                    @覆盖
                    公共无效onCheckedChanged(CompoundButton cEmail,
                            布尔emailChecked){
                        INT ID = o.getObject_id();
                        算上++;
                        INT uText = text.isChecked()? 1:0;
                        INT uEmail = email.isChecked()? 1:2;
                        字符串catURL =htt​​ps://example.com/?fn=myfavs&a=add&ot=2&oid=
                                + ID +&放大器; F1 =+ uText +&放大器; F2 =+ uEmail;
                        UpdateFavs U =新UpdateFavs();
                        u.execute(catURL);
                        日志(URL+ catURL);                        LOG(算:+计数);
                    }                });            }
            返回伏;
        }    }私有类UpdateFavs扩展的AsyncTask<弦乐,太虚,字符串> {
        InputStream为;
        字符串结果;        @覆盖
        在preExecute保护无效(){
            pBar.setVisibility(View.VISIBLE);
        }        @覆盖
        保护字符串doInBackground(字符串... ID){
            尝试{                //最后弦乐catURL =
                //https://citygro.com/?fn=myfavs&a=add&ot=2&oid=
                // +&放大器; F1 =+ uText +&放大器; F2 =+ uEmail;
                串catURL = ID [0];                DefaultHttpClient的HttpClient =新DefaultHttpClient();
                HttpPost httppost =新HttpPost(catURL);
                ArrayList的<&的NameValuePair GT; namevaluepairs中=新的ArrayList<&的NameValuePair GT;();                nameValuePairs.add(新BasicNameValuePair(ID,
                        的getCookie()));                httppost.setEntity(新UrlEn codedFormEntity(namevaluepairs中));
                httpclient.execute(httppost);            }赶上(UnsupportedEncodingException五){
                // TODO自动生成catch块
                e.printStackTrace();
            }赶上(ClientProtocolException E){
                // TODO自动生成catch块
                e.printStackTrace();
            }赶上(IOException异常五){
                // TODO自动生成catch块
                e.printStackTrace();
            }            返回结果;
        }        @覆盖
        保护无效onPostExecute(字符串结果){
            pBar.setVisibility(View.GONE);        }    }


解决方案

都让你的 ItemAdapter 类实现第一 OnCheckedChangeListener 。在您的code,一个新的监听器将被实例每次列表滚动的时间。此外,由于意见对他们的监听器集,听者的 onCheckedChanged()方法将被调用每次滚动的时间。我建议尝试这样的:

 私有类ItemAdapter扩展ArrayAdapter< FavItem>实现OnCheckedChangeListener {
 私人最终的ArrayList< FavItem>猫;
 公众诠释计数;
 //私人上下文米;

私人持有人持有人;

公共ItemAdapter(上下文的背景下,INT textViewResourceId,ArrayList的myItems){
             超(背景下,textViewResourceId,myItems);
            this.cats = myItems;
            // this.m =背景;
         }
    @覆盖
         公共查看getView(INT位置,查看convertView,父母的ViewGroup){

 如果(convertView == NULL){
            LayoutInflater VI =(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             // LayoutInflater VI = getLayoutInflater();
            V = vi.inflate(R.layout.favitem,NULL);
持有人=新的持有人();
holder.title =(TextView中)v.findViewById(R.id.textViewNear1);
holder.text =(切换按钮)v.findViewById(R.id.texttoggle);
holder.sub =(TextView中)v.findViewById(R.id.textViewNear2);
holder.email =(切换按钮)诉.findViewById(R.id.emailtoggle);
convertView.setTag(保持器)
         }其他{
支架= convertView.getTag();
         }
         最后FavItem O = cats.get(位置);
         如果(O!= NULL){
holder.text.setTag(位置);
holder.email.setTag(位置);
              //首先删除任何监听器已经present
            持有人。 text..setOnCheckedChangeListener(NULL);
            持有人。 email.setOnCheckedChangeListener(NULL);
//你现在可以设置选中状态。我们已经删除的监听,所以不会触发checkd更改呼叫
              持有人。 text.setChecked(o.getFav_sms()== 1真?假的);
             holder.email.setChecked(o.getFav_email()== 1真?假的);
             holder.title.setText(o.getBusiness_name());
             holder.sub.setText(o.getDeal_name());
//现在设置听众的意见。 (以便检查活动将只由用户手动通过滚动lsit triggerde而不是
持有人。 text.setOnCheckedChangeListener(本);
 holder.email.setOnCheckedChangeListener(本);
返回convertView;
}类持有人{
     TextView的标题,分;
     切换按钮文本,电子邮件;
  }@覆盖
   公共无效onCheckedChanged(CompoundButton B,布尔emailChecked){
INT位置=(整数)b.getTag(); //现在你知道在列表按钮的位置。
开关(b.getId(){
    案例R.id.texttoggle://切换按钮
       //做你想做的
       打破;
     案例R.id.emailtoggle:
        //做你想做的
        打破;
}   }

设置检查将这样的伎俩在项目之前每次删除监听器。不要看到holder类的使用方式。这减少了次数findViewById()从getView()方法被调用。希望这有助于

The problem is,onCheckedChange() methods get called repeatedly and the phone runs out of memory. When I take the calls to the AsyncTask out of the checkedChange method it works fine. Or if I take the setChecked() calls out it works fine as well. But I have to have those methods in there for this portion of the application to make sense. The WebService calls are super short but have to be toggled from the Toggle button.

I would like you to share some of your thoughts and opinions.

private class ItemAdapter extends ArrayAdapter<FavItem> {

        private final ArrayList<FavItem> cats;
        public int count;

        // private Context m;
        public ItemAdapter(Context context, int textViewResourceId,
                ArrayList<FavItem> myItems) {
            super(context, textViewResourceId, myItems);
            this.cats = myItems;
            // this.m = context;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;

            if (v == null) {
                LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                // LayoutInflater vi = getLayoutInflater();
                v = vi.inflate(R.layout.favitem, null);
            }
            final FavItem o = cats.get(position);
            if (o != null) {

                TextView title = (TextView) v.findViewById(R.id.textViewNear1);
                TextView sub = (TextView) v.findViewById(R.id.textViewNear2);
                final ToggleButton text = (ToggleButton) v
                        .findViewById(R.id.texttoggle);
                final ToggleButton email = (ToggleButton) v
                        .findViewById(R.id.emailtoggle);
                text.setChecked(o.getFav_sms() == 1 ? true : false);
                email.setChecked(o.getFav_email() == 1 ? true : false);
                title.setText(o.getBusiness_name());
                sub.setText(o.getDeal_name());

                text.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton cText,
                            boolean textCheck) {
                        count++;
                        int uText = text.isChecked() ? 1 : 0;
                        int uEmail = email.isChecked() ? 1 : 2;
                        int id = o.getObject_id();
                        String catURL = "https://example.com/?fn=myfavs&a=add&ot=2&oid="
                                + id + "&f1=" + uText + "&f2=" + uEmail;
                        UpdateFavs u = new UpdateFavs();
                        u.execute(catURL);
                        log("URL" + catURL);

                        log("count: " + count);
                    }
                });
                email.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton cEmail,
                            boolean emailChecked) {
                        int id = o.getObject_id();
                        count++;
                        int uText = text.isChecked() ? 1 : 0;
                        int uEmail = email.isChecked() ? 1 : 2;
                        String catURL = "https://example.com/?fn=myfavs&a=add&ot=2&oid="
                                + id + "&f1=" + uText + "&f2=" + uEmail;
                        UpdateFavs u = new UpdateFavs();
                        u.execute(catURL);
                        log("URL" + catURL);

                        log("count: " + count);
                    }

                });

            }
            return v;
        }

    }

private class UpdateFavs extends AsyncTask<String, Void, String> {
        InputStream is;
        String result;

        @Override
        protected void onPreExecute() {
            pBar.setVisibility(View.VISIBLE);
        }

        @Override
        protected String doInBackground(String... id) {
            try {

                // final String catURL =
                // "https://citygro.com/?fn=myfavs&a=add&ot=2&oid="
                // + "&f1=" + uText + "&f2=" + uEmail;
                String catURL = id[0];

                DefaultHttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost(catURL);
                ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

                nameValuePairs.add(new BasicNameValuePair("ID",
                        getCookie()));

                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                httpclient.execute(httppost);

            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            pBar.setVisibility(View.GONE);

        }

    }

解决方案

First of all let your ItemAdapter class implement OnCheckedChangeListener. In your code, a new listener will be instantiated every time the list is scrolled. Also, since the views have a listener set on them, the listener's onCheckedChanged() method will be called every time you scroll. I suggest trying this :

private class ItemAdapter extends ArrayAdapter<FavItem> implements OnCheckedChangeListener {     
 private final ArrayList<FavItem> cats;        
 public int count;     
 // private Context m;

private Holder holder;

public ItemAdapter(Context context, int textViewResourceId, ArrayList myItems) { super(context, textViewResourceId, myItems); this.cats = myItems; // this.m = context; } @Override public View getView(int position, View convertView, ViewGroup parent) {

          if (convertView == null) { 
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             // LayoutInflater vi = getLayoutInflater(); 
            v = vi.inflate(R.layout.favitem, null);
holder=new Holder();
holder.title= (TextView) v.findViewById(R.id.textViewNear1);
holder.text= (ToggleButton) v.findViewById(R.id.texttoggle);
holder.sub= (TextView) v.findViewById(R.id.textViewNear2); 
holder.email= (ToggleButton) v .findViewById(R.id.emailtoggle);
convertView.setTag(holder)
         }else{
holder=convertView.getTag();
         }
         final FavItem o = cats.get(position);
         if (o != null) {
holder.text.setTag(position);
holder.email.setTag(position);
              //first remove any listener already present
            holder. text..setOnCheckedChangeListener(null);
            holder. email.setOnCheckedChangeListener(null);
//you can now set checked state. we already removed the listener, so it will not trigger the checkd change call
              holder. text.setChecked(o.getFav_sms() == 1 ? true : false);
             holder.email.setChecked(o.getFav_email() == 1 ? true : false);
             holder.title.setText(o.getBusiness_name());
             holder.sub.setText(o.getDeal_name());
//set the listener to the views now. ( so that check events will only be triggerde manually by user and not by scrolling the lsit
holder. text.setOnCheckedChangeListener(this);
 holder.email.setOnCheckedChangeListener(this);
return convertView;
}

class Holder{
     TextView title ,sub ;
     ToggleButton text,email;
  }

@Override
   public void onCheckedChanged(CompoundButton b,boolean emailChecked) { 
int position=(Integer)b.getTag(); //now you know position of button in list.
switch(b.getId(){
    case R.id.texttoggle: //toggle button
       //do whatever you want
       break;
     case R.id.emailtoggle:
        //do whatever you want
        break; 
}

   }

removing listener every time before setting the item checked will do the trick. Do notice the way holder class is used. This reduces the number of times findViewById() is called from getView() method. Hope this helps

这篇关于Android的ListView控件随着切换按钮Web服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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