public class PaperListActivity extends Activity{
private ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.paperlist);
//获取ListView
mListView = (ListView)findViewById(R.id.paperlist_lst);

PaperListAdapter mPaperListAdapter = new PaperListAdapter(this, R.layout.paperlist_item);
new PaperlistTask(this,mPaperListAdapter).execute();//为list加载数据
mListView.setAdapter(mPaperListAdapter);
System.out.println("childcount is :  -----"+mListView.getChildCount());
        }
}public class PaperListAdapter extends ArrayAdapter<Paper>{
private Context context;
private LayoutInflater inflater;
private int viewId; public PaperListAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
this.context = context;
inflater = LayoutInflater.from(context);
this.viewId = textViewResourceId;

} @Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("-----position---" + position);
if(convertView == null){
convertView = inflater.inflate(viewId, parent, false);
}

final Paper mPaper = getItem(position);
TextView titleView = (TextView) convertView.findViewById(R.id.paperlist_item_tv);
titleView.setText(mPaper.getP_name());

convertView.setOnClickListener(new OnClickListener(){ @Override
public void onClick(View v) {
//点击事件
Intent mIntent = new Intent(context,PaperInfoActivity.class);
mIntent.putExtra("paper", mPaper);
context.startActivity(mIntent);
}});
return convertView;
}
}
打印的结果
childcount is :  -----0
-----position---0
-----position---1打印“childcount is :  -----0”在先,是不是异步加载数据呢?还是怎样,原理怎么样?

解决方案 »

  1.   

    Adapter异步加载数据的本质是实时反应数据的状态,一旦数据准备好,就立马将它显示出来。异步主要是避免获取数据的过程中漫长的等待过程,获得更好的体验效果。
    举个例子:某个listview里面有一个显示图片的控件ImageView,该ImageView显示的图片资源来源于互联网,这个时候就要考虑用到异步了,否则Adapter要等所有的图片资源全部得到后才将listview显示出来,如果网络环境不理想,这期间会有“漫长”的等待过程。
    具体要怎么实现呢?在getView或者bindview里面首先用一张本地默认的图显示在ImageView里,同时启动线程去网上获取图片资源,一旦某张图片的数据得到就立马刷新将那张本地的图换掉。至于你这个地方是不是异步加载数据,要看PaperlistTask里面干了些什么,你可以贴出来让大家看看。
      

  2.   

    当然是异步加载数据,异步的原理http://blog.csdn.net/coding_or_coded/article/details/6821267
      

  3.   


    /**
     * Method name: dealWallPaper<BR>
     * Method description:处理墙纸 <BR>
     * 
     */
    private void dealWallPaper() {
    ImageView imageView03 = (ImageView) this
    .findViewById(R.id.ss_01_03_img03);
    imageView03.setOnClickListener(new OnClickListener() { public void onClick(View v) {
    // show dialog
    Context context = v.getContext();
    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    ListView listView = (ListView) mInflater.inflate(R.layout.listview, null);

    // 获得所有的图片
    ArrayList<PathName> list = getWallPapers();

    // 初始显示5张墙纸
    ArrayList<PathName> tempList = new ArrayList<PathName>();
    for(int i =0;i< list.size() && i< 5;i++){
    tempList.add(list.get(i));
    }

    // 墙纸显示的适配器
    WallPaperAdapter adapter = new WallPaperAdapter(context, tempList);
    listView.setAdapter(adapter);

    // 异步加载墙纸
    showPapers(adapter, list, scene.getWallpaper());

    new AlertDialog.Builder(context).setTitle(R.string.ss0103_wallpaper_detail)

    .setView(listView)
    .setPositiveButton(R.string.common_ok, new WallPaperListener(adapter))
    .setNegativeButton(R.string.common_cancel, new WallPaperListener(adapter))
    .show();
    } });
    }
    package com.jftt.smart.activity.adapter;import java.util.ArrayList;import android.content.Context;
    import android.graphics.BitmapFactory;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.View.OnClickListener;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.RadioButton;
    import android.widget.TextView;import com.jftt.smart.R;
    import com.jftt.smart.pojo.PathName;
    import com.jftt.smart.util.SceneUtil;public class WallPaperAdapter extends BaseAdapter {
    private LayoutInflater inflater;
    private ArrayList<PathName> items;
    public WallPaperAdapter(Context context, ArrayList<PathName> list){
    this.inflater = LayoutInflater.from(context);
    items = new ArrayList<PathName>();

    if(list != null){
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 16;
    for(PathName bean : list){
    bean.image = SceneUtil.decodeBitmap(bean.path, options);
    items.add(bean);
    }
    }
    }

    public void clear() {
            items.clear();
            notifyDataSetChanged();
        }
        
        public void add(PathName bean) {
         items.add(bean);
        }

    public int getCount() {
    // TODO Auto-generated method stub
    return items.size();
    } public PathName getItem(int position) {
    // TODO Auto-generated method stub
    return items.get(position);
    } public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
    }

    public boolean isEnabled(int position) {
    return false;
    } public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ViewHolder holder;
            if (convertView == null) {
             convertView = inflater.inflate(R.layout.list_item_001, parent, false);
            
             holder = new ViewHolder();
             holder.imageView = (ImageView) convertView.findViewById(R.id.li001_img001);
             holder.textView = (TextView) convertView.findViewById(R.id.li001_tv001);
             holder.radioBtn = (RadioButton) convertView.findViewById(R.id.li001_rb001);
             convertView.setTag(holder);
            }else{
             holder = (ViewHolder) convertView.getTag();
            }
            
            PathName bean = items.get(position);
            holder.imageView.setImageBitmap(bean.image);
            holder.textView.setText(bean.name);
            holder.radioBtn.setChecked(bean.checked);
            holder.radioBtn.setOnClickListener(new SingleChoiceListener(position));
    return convertView;
    }

    private class SingleChoiceListener implements OnClickListener {
    private int position;
    public SingleChoiceListener(int position) {
    this.position = position;
    } public void onClick(View arg0) {
    items.get(position).checked = true;
    for (int i = 0; i < items.size(); i++) {
    if (i != position) {
    items.get(i).checked = false;
    }
    }
    WallPaperAdapter.this.notifyDataSetChanged();
    }
    }
    }class ViewHolder {
    public TextView textView;
    public ImageView imageView;
    public RadioButton radioBtn;
    }
      

  4.   

    asynctask仅仅是和ui异步这个概念罢了  如果你说adapter异步加载  那样的效果就是每个item加载都是异步的并且和ui也是异步的  而asynctask虽然和ui是异步的  但是不能做到每个item异步加载  所以想要做到每个item异步加载就需要在adapter的getview方法入手 一般用回调来实现 修改ui的部分要在ui中执行