如何从数据库中获取时使用AsyncTask在listview上进行平滑滚动?

时间:2011-10-18 07:30:38

标签: android listview android-asynctask

我正在制作列表视图,但滚动速度太慢。 我在页面中有一个ImageButton和TextView。 如果我点击ImageButton,我可以从相册中获取照片。 如果保存,图像uri(相册专辑)和文本保存到数据库中。 然后listview从数据库中获取数据。

我可以在列表视图上看到图像和文字。 但滚动速度太慢.. 我在这段代码中使用AsyncTask,但作为一个初学者,我不知道如何准确使用AsyncTask来更好地滚动

任何人都可以看到我的代码并指导我吗?

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.list);
    lv=(ListView)findViewById(R.id.listView1);
    new SubClass().execute();
}

/ * ** * ** * ** * ** * ** * ** CustomCursorAdapter * ** * 的** * ** * ** * ** * ** * /

public class CustomCusorAdapter extends CursorAdapter{  
    RelativeLayout listview_relative;

    public CustomCusorAdapter(Context context, Cursor c) {
        super(context, c);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void bindView(View v, Context context, Cursor cursor) {

        wrap = (ViewWrap) v.getTag();

        for(int i=0; i<cursor.getColumnCount();i++){

        }
        if(cursor.getPosition()%2==1){   //if position is odd, color is something.      

    wrap.getRelative().setBackgroundColor(0xfff0f8ff);  
        }
        else if(cursor.getPosition()%2==0){   //if position is even, color is something other.

            wrap.getRelative().setBackgroundColor(0xfffff5ee);
        }


        String titleText = cursor.getString(1);
        String bodyText = cursor.getString(2);
        String dateText = cursor.getString(3);
        imageStr = cursor.getString(4);

        wrap.getTitle().setText(titleText);
        wrap.getDate().setText(dateText);
        wrap.getBody().setText(bodyText);

        if(imageStr != null){
            uri = Uri.parse(imageStr);
            wrap.getImage().setImageURI(uri);
        }else{
            wrap.getImage().setImageResource(R.drawable.resize_camera_input_photo1);

        }
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = getLayoutInflater();
        View v = inflater.inflate(R.layout.listview, null);
        ViewWrap wrap = new ViewWrap(v);
        v.setTag(wrap);
        return v;
    }

}//CustomCusorAdapter

/ * ** * ** * Sub AsyncTask * * < / EM> ** * ** * ** * ** * ** * < / EM> ** * ** * ** * ** * ** * < / EM> ** * ** * ** * ** * ** * < / EM> ** * ** * ** * *** /

class SubClass extends AsyncTask<Cursor, Cursor, Cursor>{

    @Override
    protected Cursor doInBackground(Cursor... params) {
        mydb = new MyDatabase(getBaseContext());    
        db = mydb.getReadableDatabase();
        cursor = db.rawQuery("select * from "+ TABLE_NAME + " order by _id desc;", null);       

        startManagingCursor(cursor);
        return cursor;
    }

    @Override
    protected void onPostExecute(Cursor result) {
        adapter = new CustomCusorAdapter(getBaseContext(), result);
        lv.setAdapter(adapter);
        mydb.close();
        db.close();
    }
}

1 个答案:

答案 0 :(得分:0)

由于您只是在AsyncTask返回后滚动列表,我认为这不是与获取数据相关的问题。

适配器可以进行一组优化:

  1. 不要将setter / getter用于ViewWrap类。使用公共字段并直接访问它们。
  2. 不要在每个newView()中创建LayoutInflater。这是一个非常耗费的过程。
  3. 只保存到此持有者(ViewWrap)所需的视图,而不是整个ViewGroup。
  4. 希望这有帮助!