0

私のフラグメント アクティビティは、このアダプターを使用してすべての結果をリストビューに表示しました。ページにはタイトル タブがあり、各タブにはリストの結果が表示されます。
現在、内部ストレージから読み取ったリストの結果と、次のページにスワイプするたびにわずかなラグまたは遅延が発生するため、このページアダプター内に 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));
}

このように、各アイテムには独自のスレッドがあり、ロードされるアイテムの数に関係なく心配する必要はありません。

編集もう 1 つ、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 に答える