Android 之Java基础---一个列表框引发的血案暨java装箱拆箱的实际应用
为了提高代码的封装性及可读性,我把原来手懒搞的一些AsyncTask的继承内部类决定都单独拉到一个文件夹中,但这一拉,出事情了!
我的应用业务是,有一个min_question_id(int )来记录目前读取到的服务器端数据,原来是内部类的时候,用的好好的,这把它单独剥离出来,每次拉取数据却是从头拉取了!
好了,先上原来的代码!
public class getQuestionListDataTask extends AsyncTask<Void, Void, Void> { private static final int GETREFRESUCCESS=5000; private static final int GETREQUESTERROR=5001; private static final int DATASETEMPTY=5002; PullToRefreshListView mPullToRefreshLayout; List<HashMap<String, Object>> listItemQuestion; boolean isFirstEnter; int min_question_id; QuestionListAdapter mQuestionListAdapter; /* * mpPullToRefreshListView:异步刷新工作对应的PullToRefreshListView * mList:PullToRefreshListView对应的后台数据引用 * isfirstEnter:记录是否第一次开机后第一次进入app * min_question_id:获取问题列表时候的最小id * mQuestionListAdapter:驱动mpPullToRefreshListView的适配器 */ public getQuestionListDataTask(PullToRefreshListView mPullToRefreshListView,List<HashMap<String, Object>> mList, booleanisfirstEnter,int min_question_id,QuestionListAdapter mQuestionListAdapter) { super(); this.mPullToRefreshLayout=mPullToRefreshListView; this.listItemQuestion=mList; this.isFirstEnter=isfirstEnter; this.min_question_id=min_question_id; this.mQuestionListAdapter=mQuestionListAdapter; } @Override protected Void doInBackground(Void... arg0) { // TODO Auto-generated method stub if(mPullToRefreshLayout.isHeaderShown()) { listItemQuestion.clear(); getQuestionListData(0, true); isFirstEnter=false; } if(mPullToRefreshLayout.isFooterShown()) { getQuestionListData(min_question_id,false); } else { listItemQuestion.clear(); getQuestionListData(0, true); //getHttpData(min_question_id,false); } return null; } @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub mQuestionListAdapter.notifyDataSetChanged(); mPullToRefreshLayout.onRefreshComplete(); super.onPostExecute(result); }
}里面的getQuesionListData是一个拉取网络数据的接口,由于大家都懂的的原因,我就不贴出来啦~~我的要求是每一次拉取完数据(实例化一次getQuesionListDataTask并执行),都在getQuesionListData更新min_question_id的值。
显然,数据每次都还从头拉的原因就是这个min_question_id并没有得到更新!
java的传递不是值传递吗?!
是吗?!不是,这只是我的一个误区。
①基本类型变量,包括char、byte、short、int、long、float、double、boolean 。
②非基本变量。
而非基本变量是引用传递,基本变量是值传递!
那怎么办呢?难道我们要把char、byte、short、int、long、float、double、boolean这些东西自己写个wrapper把它们wrap成类?却是是这样的!但是我们不用自己写,java自身就带有这些包,就是这些基本类型的包装类!
分别和上面基本变量类型对应的是:Character,Byte,Short,Integer,Long,Float,Double,Boolean。
而且支持自动wrap/unwrap,妈妈再也不用担心我的手指了!
这样,我们就可以在需要在函数或类内部改变基本变量的值时,将其里面和外面的基本类型变量类型都改为包装类名~
于是,我现在的代码是这样的:
外部类:
public class AskFragment extends Fragment implements OnClickListener { private static Boolean isFirstEnter=true; private Integer min_question_id=1000; private List<HashMap<String, Object>> listItemQuestion = new ArrayList<HashMap<String, Object>>(); private View rootView; private View headerView; private ImageButton mSearchButton,mAddButton,headPicButton; private PullToRefreshListView mPullToRefreshLayout; QuestionListAdapter mQuestionListAdapter; public void onActivityCreated(Bundle savedInstanceState) { new getQuestionListDataTask(mPullToRefreshLayout, listItemQuestion, isFirstEnter, min_question_id, mQuestionListAdapter).execute(); } } }getQuestionListDataTask是这样的:
public class getQuestionListDataTask extends AsyncTask<Void, Void, Void> { private static final int GETREFRESUCCESS=5000; private static final int GETREQUESTERROR=5001; private static final int DATASETEMPTY=5002; PullToRefreshListView mPullToRefreshLayout; List<HashMap<String, Object>> listItemQuestion; Boolean isFirstEnter; Integer min_question_id; QuestionListAdapter mQuestionListAdapter; /* * mpPullToRefreshListView:异步刷新工作对应的PullToRefreshListView * mList:PullToRefreshListView对应的后台数据引用 * isfirstEnter:记录是否第一次开机后第一次进入app * min_question_id:获取问题列表时候的最小id * mQuestionListAdapter:驱动mpPullToRefreshListView的适配器 */ public getQuestionListDataTask(PullToRefreshListView mPullToRefreshListView,List<HashMap<String, Object>> mList, Boolean isfirstEnter,Integer min_question_id,QuestionListAdapter mQuestionListAdapter) { super(); this.mPullToRefreshLayout=mPullToRefreshListView; this.listItemQuestion=mList; this.isFirstEnter=isfirstEnter; this.min_question_id=min_question_id; this.mQuestionListAdapter=mQuestionListAdapter; } @Override protected Void doInBackground(Void... arg0) { // TODO Auto-generated method stub if(mPullToRefreshLayout.isHeaderShown()) { listItemQuestion.clear(); getQuestionListData(0, true); isFirstEnter=false; } if(mPullToRefreshLayout.isFooterShown()) { getQuestionListData(min_question_id,false); } else { listItemQuestion.clear(); getQuestionListData(0, true); //getHttpData(min_question_id,false); } return null; } @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub mQuestionListAdapter.notifyDataSetChanged(); mPullToRefreshLayout.onRefreshComplete(); super.onPostExecute(result); }
}就这样就搞定了,有木有!列表正常显示了!
说明:由于只是示例作用,代码截自我的项目,很多东西删去了,也有的变量没初始化,但大家不要介意这些细节~
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。