带切换按钮的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;
}
}