Как использовать AsyncTask для плавной прокрутки на просмотр списка при получении из базы данных? - PullRequest
1 голос
/ 18 октября 2011

Я делаю просмотр списка, но прокрутка идет слишком медленно.У меня есть ImageButton и TextView на странице.если я нажимаю на ImageButton, я могу получить фотографию из альбома камеры.При сохранении изображения URI (Альбом камеры) и тексты сохраняются в базе данных.и затем просмотр списка получает данные из базы данных.

Я хорошо вижу изображение и текст в просмотре списка.но прокрутка слишком медленная ... Я использую AsyncTask в этом коде, но я новичок, я не знаю, как именно использовать AsyncTask для лучшей прокрутки1005 *

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 *********************************************************** /

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 голосов
/ 18 октября 2011

Поскольку вы просто прокручиваете список после возвращения AsyncTask, я не думаю, что это проблема, связанная с извлечением данных.

Адаптер может принимать ряд оптимизаций:

  1. Не используйте сеттеры / геттеры для класса ViewWrap. Используйте открытые поля и получайте к ним доступ напрямую.
  2. Не создавайте FlaoutInflater в каждом newView (). Это довольно трудоемкий процесс.
  3. Сохраняйте в этом держателе (ViewWrap) только нужные вам представления, а не всю ViewGroup.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...