0

我的片段活动使用此适配器在列表视图中显示所有结果。该页面将有一个标题选项卡,每个选项卡都有列表结果。
现在我从内部存储中读取的列表结果,每次我滑动到下一页时都会有轻微的滞后或延迟,所以我正在考虑在这个 pageradapter 中实现 ASYNCTask,这样体验会更好,但我不知道在哪里实现。大佬能指点一下吗??

public class ViewPagerAdapter extends PagerAdapter 
{        
public ViewPagerAdapter( Context context )
{
    //This is where i get my title
     for (HashMap<String, String> channels : allchannel){       
            String title = channels.get(KEY_TITLE);
            titles[acc] = title;
            acc++;
     }
       scrollPosition = new int[titles.length];

    for ( int i = 0; i < titles.length; i++ )
    {
        scrollPosition[i] = 0;
    }
}

@Override
public String getPageTitle( int position )
{           
    return titles[position];
}

@Override
public int getCount()
{
    return titles.length;
}

@Override
public Object instantiateItem( View pager, final int position )
{
    String filename = null;
    ListView v = new ListView( context );
    final ArrayList<HashMap<String, String>> items = new ArrayList<HashMap<String, String>>();

    DatabaseHandler db = new DatabaseHandler(context);

    filename = openFile("PAGE1"); //OpenFile function is read file from internal storage
    switch(position){
    case 0:
        filename = openFile("PAGE1");
        break;
    case 1:
        filename = openFile("PAGE2");
    break;
    case 2:
        filename = openFile("PAGE3");
        break;
    }

       try{
        //Use json to read internal storage file(Page1/Page2) and display all the result on the list

        }
       }catch(Exception e){

       }

    ListAdapter listadapter=new ListAdapter(context, items);
    v.setAdapter( listadapter );
    ((ViewPager)pager ).addView( v, 0 );

    return v;
}

@Override
public void destroyItem( View pager, int position, Object view )
{
    ( (ViewPager) pager ).removeView( (ListView) view );
}

@Override
public boolean isViewFromObject( View view, Object object )
{
    return view.equals( object );
}

@Override
public void finishUpdate( View view )
{
}

@Override
public void restoreState( Parcelable p, ClassLoader c )
{
    if ( p instanceof ScrollState )
    {
        scrollPosition = ( (ScrollState) p ).getScrollPos();
    }
}

@Override
public Parcelable saveState()
{
    return new ScrollState( scrollPosition );
}

@Override
public void startUpdate( View view )
{
}

}

4

2 回答 2

2

我建议这样做

@Override
public Object instantiateItem( View pager, final int position )
{

//Some other work related to instantiation of item    

     AsyncTask<Uri, Void, Bitmap> mLoadTask = new AsyncTask<Uri, Void, Bitmap>() {              
     //async task for loading images in background

        @Override
        protected void onPostExecute(Bitmap result) {
            pageview[position].setImageBitmap(result);                                         
            //post in ui thread
            //this way you have a reference object for each item(using position)
            //and hence you can start several tasks at the same time             
        }

        @Override
        protected Bitmap doInBackground(Uri... params) {        
            Bitmap bitmap=getBitmap(params[0]);    
            //here getBitmap returns the bitmap using uri arguement
            return bitmap;
        }

    };
    mLoadTask.execute(Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + image_id));
}

这样每个项目都有自己的线程,无论加载多少项目,您都不必担心。

编辑还有一件事,您可以在 AsyncTask 代码之后立即从此方法返回 pageview[position],这样视图将显示为空白(实现平滑滚动),直到 AsyncTask 完成后台工作。但它仍然能够将位图设置为正确的视图,因为它内部有引用onPostExecute

于 2012-11-23T13:32:07.140 回答
0

我在构造函数中做它,它工作正常。例子:

public MyAdapter(Context context) {
    this.context = context;
    try {
        whatIneed = new DoSomeAsyncStuff(this.context).execute().get();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
            e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }



}
于 2012-11-22T09:34:07.983 回答