今天写了一个异步加载图片,防止图片错位的demo,自己自定义了一个baseAdapter,我的天,一直都是空白界面,listview的getview()方法不执行,请调试很很久,按照理论应该是可以出来数据的。找了种种,结果就是数据的问题,看着别人的总结方法我也写一下。
第一、没有执行getview往往是因为没有显示页面。这个时候,我们首先要保证确实有有效的数据传到了自定义的适配器里。因为如果getcount()的返回值是0的话,getview是不会被执行的。
第二、要确认adapter在核实的时间和位置去实例化,比如说在异步任务的onPostExecute()方法中去实例化adapter的话,甚至会导致该方法也不会被执行到,当然getview更执行不到了。
第三、布局的问题。在xml文件中,有些属性会极大的影响到getview的执行。他执行的前提是,他有空间去展示。当你将listview设置为gone的时候,他是不会去执行这个方法的。在适配数据前将他改为可见就好了。
另外一个就是将父布局设置成android:layout_height="wrap_content",因为页面的测量是在oncreate的时候被测量的。而此时里面是没有内容的,也就是高度为0,在数据加载好之后,父布局并没有重新测量,而只是listview重新测量了,但是因为listview此时的高度是0,所以getview()还是无法被执行到。将android:layout_height="wrap_content"改成android:layout_height="match_parent"就好了
下面提供一下baseadapter。用的时候方便使用
**
* Created by 凉菇凉on 2016/8/24.
*/
public abstract class BasicAdapter extends android.widget.BaseAdapter {
private ArrayListmList;
private Context context;
public BasicAdapter(Context context,ArrayListmList){
this.context=context;
this.mList=mList;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int i) {
return mList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(getViewId(),
null);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
setDate(convertView, mList.get(i), holder, i);
return convertView;
}
public final class ViewHolder{
public SparseArrayviews=new SparseArray();
@SuppressWarnings("unchecked")
public E findView(View convertView, int resid) {
View v = views.get(resid);
if (null == v) {
v = convertView.findViewById(resid);
views.put(resid, v);
}
return ((E) v);
}
}
protected abstract int getViewId();
protected abstract void setDate(View view, T t, ViewHolder viewHolder,
int position);
}
在activity中用的时候是这样子的】
/**
* 凉菇凉
*/
class MyAdapter extends BasicAdapter{
public MyAdapter(Context context, ArrayList mList) {
super(context, mList);
}
@Override
protected int getViewId() {
return R.layout.activity_image_listview_item;
}
@Override
protected void setDate(View view, String s, ViewHolder viewHolder, int position) {
TextView tv_title = (TextView)viewHolder.findView(view,R.id.tv_title);
tv_title.setText(s);
}
}