Android listview&gridview getview 方法多次调用问题解决方法 并附上单页加载实现问卷调查适配器源代码

转自:http://blog.csdn.net/wx_962464/article/details/9026171

一 、 关于listview 的问题

     (1)情况一:
     今天在改毕设代码的时候,突然发现一个奇怪的现象,就是在在定义的listview中有一个imageview和一个textview,但是当启动这个listview的时候,同一个item的图片会不断的变化,很是奇怪,于是在adapter中进行调试发现,getview,执行了很多次,而且次数也不定,最后在网上发现说是由于listview的item的高度不定,所以很次都要宠幸你计算,而导致需要多次调用getview方法,只需要把该listview的父控件布局改为fill_parent就ok了,这个方法确实可以解决这个问题。所以遇到这个问题,这样改一下就可以了。

      (2) 情况二 : 
     当然如果你还遇到在dialog中使用setadapter来加载一个listview的时候使用上面的方法就不起作用了,这个问题我也没有找到根本的原因,但是找到的解决办法就是,在getview中进行条件判断就能阻止多次调用的问题。使用下面的 判断来防止多次执行。


[java]  view plain copy print ?
  1. if(parent.getchildcount() == position)  
  2. {  
  3.        正常情况下应该执行的代码  
  4. }  
  5. else  
  6. {  
  7.      这里就是多次加载的问题,可以不用理这里面的 代码,  
  8. }  

这样就可以防止多次执行getview的方法。


二  、 关于gridview 的问题
问题和上面基本上是一样的,但是不同的是 ,这个getview多次执行的只是position=0  item 所以与上面的问题有所不同,但是原因还是差不多的,它也是不知道item的高度是多少所以系统会用第一项进行加载测试,所以gridview的第一项就会多次加载。为了解决这个问题,其实方法和上面提到的第二种情况是一样的。也是在getview中进行if else 的判断就可以了。代码与上面是一样的。

[java]  view plain copy print ?
  1. if(parent.getchildcount() == position)  
  2. {  
  3.        正常情况下应该执行的代码  
  4. }  
  5. else  
  6. {  
  7.      这里就是多次加载的问题,可以不用理这里面的 代码,  
  8. }  

总结下就是要我们使用布局问题的属性的时候,有时候觉得两个属性的性质差不多,但是有时候就会给我们带来很多的问题,我们以后在使用布局属性的时候要注意这些问题,尽量弄清楚每个属性的含义然后再使用,这样就会避免很多的位置的错误。希望大家以后也要注意。^_^


package com.qianhua.healthy_brain.adapter;

import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.TextView;

import com.qianhua.healthy_brain.R;
import com.qianhua.healthy_brain.ui.QuestionnaireActivity;

public class QuestionnaireAdapter extends MyBaseAdapter {
	int next=0;
	View mcontentView;
	int mposition;
	boolean first=true;
	Holder holder=null;
	int sum=0;
	int sore[];
	public QuestionnaireAdapter(Activity activity, Object[] params) {
		super(activity, params);
		// TODO Auto-generated constructor stub
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return 1;
	}

	@Override
	public Map<String, Object> getItem(int position) {
		// TODO Auto-generated method stub
		return mData.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View contentView, final ViewGroup parent) {
		// TODO Auto-generated method stub
		mcontentView=contentView;
		if(first==true){
//			Log.e("", "position---:"+position);
			mposition=position;
			first=false;
		}
		if (mcontentView==null) { 
			holder=new Holder();
			mcontentView=mInflater.inflate(R.layout.questionnaire_page_item, null);
			holder.title=(TextView)mcontentView.findViewById(R.id.questionnaire_question_title);
			holder.radiobuttons=new RadioButton[4];
			holder.radiobuttons[0]=(RadioButton)mcontentView.findViewById(R.id.questionnaire_answer_radioButton1);
			holder.radiobuttons[1]=(RadioButton)mcontentView.findViewById(R.id.questionnaire_answer_radioButton2);
			holder.radiobuttons[2]=(RadioButton)mcontentView.findViewById(R.id.questionnaire_answer_radioButton3);
			holder.radiobuttons[3]=(RadioButton)mcontentView.findViewById(R.id.questionnaire_answer_radioButton4);
			holder.nextBtn=(Button)mcontentView.findViewById(R.id.questionnaire_item_nest_btn);
			mcontentView.setTag(holder);
		}else {
			holder=(Holder)mcontentView.getTag();
		}
		
		holder.title.setText(mData.get(mposition).get("title").toString());
		try {
			sore=new int[4];
			JSONArray jsonArray=new JSONArray(mData.get(mposition).get("answers").toString());
			//Log.e("111111", "jsonArray.length()---:"+jsonArray.length());
			for (int i = 0; i < jsonArray.length(); i++) {
				JSONObject jsonObject=new JSONObject(jsonArray.get(i).toString());
				holder.radiobuttons[i].setText(jsonObject.get("answer").toString());
				sore[i]=(int)Integer.valueOf(jsonObject.get("sore").toString());				
			}
			
			holder.nextBtn.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View view) {
					// TODO Auto-generated method stub
					if (mposition<mData.size()-1) {
						for (int i = 0; i < 4; i++) {
							if (holder.radiobuttons[i].isChecked()) {
								sum+=sore[i];
							}
						}
						
						mposition++;
						Log.e("", "mposition:"+mposition);
						QuestionnaireActivity.adapter.getView(mposition, mcontentView, parent);
						QuestionnaireActivity.adapter.notifyDataSetChanged();
					}else {
						holder.nextBtn.setText(sum+"分");
					}
				}
			});
			
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return mcontentView;
	}
	
	private final class Holder{
		TextView title;
		private RadioButton[] radiobuttons;
		private Button nextBtn;
	} 

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值