带切换按钮的Android ListView Web服务

带切换按钮的Android ListView Web服务,android,web-services,Android,Web Services,问题是,onCheckedChange()方法被反复调用,手机内存不足。当我从checkedChange方法中调用AsyncTask时,它工作正常。或者,如果我使用setChecked()调用,它也可以正常工作。但是我必须有这些方法才能让应用程序的这一部分有意义。WebService调用非常短,但必须从Toggle按钮进行切换 我希望你能分享一些想法和观点 private class ItemAdapter extends ArrayAdapter<FavItem> {

问题是,
onCheckedChange()
方法被反复调用,手机内存不足。当我从
checkedChange
方法中调用
AsyncTask
时,它工作正常。或者,如果我使用
setChecked()
调用,它也可以正常工作。但是我必须有这些方法才能让应用程序的这一部分有意义。
WebService
调用非常短,但必须从
Toggle
按钮进行切换

我希望你能分享一些想法和观点

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://example.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);

        }

    }
私有类ItemAdapter扩展了ArrayAdapter{
私人最终ArrayList猫;
公共整数计数;
//私人语境;
公共项适配器(上下文,int textViewResourceId,
ArrayList(我的项目){
超级(上下文、textViewResourceId、myItems);
this.cats=myItems;
//m=上下文;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图v=转换视图;
如果(v==null){
LayoutInflater vi=(LayoutInflater)getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
//LayoutInflater vi=getLayoutInflater();
v=vi.充气(R.布局图.favitem,空);
}
最终FavItem o=猫。获取(位置);
如果(o!=null){
TextView title=(TextView)v.findViewById(R.id.textViewNear1);
TextView sub=(TextView)v.findViewById(R.id.textViewNear2);
最终切换按钮文本=(切换按钮)v
.findViewById(R.id.texttoggle);
最终ToggleButton电子邮件=(ToggleButton)v
.findviewbyd(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());
setOnCheckedChangeListener(新的OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮cText,
布尔文本检查){
计数++;
int uText=text.isChecked()?1:0;
int uEmail=email.isChecked()?1:2;
int id=o.getObject_id();
字符串catURL=”https://example.com/?fn=myfavs&a=add&ot=2&oid="
+id+“&f1=“+uText+”&f2=“+uEmail;
UpdateFavs u=新的UpdateFavs();
u、 执行(catURL);
日志(“URL”+catURL);
日志(“计数:”+计数);
}
});
email.setOnCheckedChangeListener(新的OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮电子邮件,
布尔值(已选中){
int id=o.getObject_id();
计数++;
int uText=text.isChecked()?1:0;
int uEmail=email.isChecked()?1:2;
字符串catURL=”https://example.com/?fn=myfavs&a=add&ot=2&oid="
+id+“&f1=“+uText+”&f2=“+uEmail;
UpdateFavs u=新的UpdateFavs();
u、 执行(catURL);
日志(“URL”+catURL);
日志(“计数:”+计数);
}
});
}
返回v;
}
}
私有类UpdateFavs扩展了AsyncTask{
输入流为;
字符串结果;
@凌驾
受保护的void onPreExecute(){
pBar.setVisibility(View.VISIBLE);
}
@凌驾
受保护的字符串doInBackground(字符串…id){
试一试{
//最终字符串catURL=
// "https://example.com/?fn=myfavs&a=add&ot=2&oid="
//+“&f1=“+uText+”&f2=“+uEmail;
字符串catURL=id[0];
DefaultHttpClient httpclient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(catURL);
ArrayList nameValuePairs=新的ArrayList();
添加(新的BasicNameValuePair(“ID”),
getCookie());
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
httpclient.execute(httppost);
}捕获(不支持的编码异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(客户端协议例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回结果;
}
@凌驾
受保护的void onPostExecute(字符串结果){
pBar.setVisibility(View.GONE);
}
}

首先,让您的
ItemAdapter
类实现
oncheckedchangelister
。在代码中,每次滚动列表时都会实例化一个新的侦听器。此外,由于视图上设置了侦听器,因此每次滚动时都会调用侦听器的
onCheckedChanged()
方法。我建议试试这个:

private class ItemAdapter extends ArrayAdapter<FavItem> implements OnCheckedChangeListener {     
 private final ArrayList<FavItem> cats;        
 public int count;     
 // private Context m;
每次在设置选中的项之前删除侦听器都可以做到这一点。注意holder类的使用方式。这减少了从getView()方法调用findViewById()的次数。希望这有帮助

          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; 
}

   }