2016-04-24 22 views
0

希望你很好,很好,從的AsyncTask傳遞的ArrayList到PagerAdapter

我有以下主要類型:

public class MainActivity extends AppCompatActivity { 
    Activity activity; 

    ViewPager viewPager; 
    CustomAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     viewPager=(ViewPager)findViewById(R.id.view_pager); 
     adapter=new CustomAdapter(this); 
     viewPager.setAdapter(adapter); 

       ConnectionAsyncTask connectionAsyncTask = new 
       ConnectionAsyncTask(MainActivity.this); 
       connectionAsyncTask.execute("http://www.mocky.io/v2/570d3677270000f600dc29b6"); 
    } 

    public void showUploader() 
    { 
     // findViewById(R.id.progressBar1).setVisibility(View.VISIBLE); 
    } 
    public void hideUploader() 
    { 
     //findViewById(R.id.progressBar1).setVisibility(View.GONE); 
    } 


    public void DisplyOnTextView(List<Student> students) { 

     List <Student> my = students ; 

    }    
} 

當我運行的應用程序,這主要活動將使用另一個類讀取JSON數據從鏈接如下:

public class StudentJasonParser { 
    public static List<Student> getObjectFromJason(String jason) 
    { 
     List<Student> students; 
     try { 
      JSONArray jsonArray = new JSONArray(jason); 
      students = new ArrayList<>(); 
      for(int i=0;i<jsonArray.length();i++) 
      { 
       JSONObject jsonObject = new JSONObject(); 
       jsonObject= (JSONObject) jsonArray.get(i); 
       Student student = new Student(); 
       student.setID(jsonObject.getInt("id")); 
       student.setName(jsonObject.getString("name")); 
       student.setUrl(jsonObject.getString("url")); 
       student.setDes(jsonObject.getString("des\n")); 
       student.setRate(jsonObject.getDouble("rate")); 
       student.setLon(jsonObject.getDouble("lon")); 
       student.setLat(jsonObject.getDouble("lat")); 
       students.add(student); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
      return null; 
     } 
     return students; 
    } 
} 

現在這個類將數據返回到下面的類:

public class ConnectionAsyncTask extends AsyncTask<String,String,String> { 
    Activity activity; 
    public ConnectionAsyncTask(Activity activity) { 
     this.activity=activity; 
    } 
    @Override 
    protected void onPreExecute() { 
     //((MainActivity)activity).DisplyOnTextView(); 
     ((MainActivity)activity).showUploader(); 
    } 
    @Override 
    protected String doInBackground(String... params) { 
     String content =HttpManager.getData(params[0]); 
     return content; 
    } 
    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
    } 
    @Override 
    protected void onPostExecute(String s) { 
     ((MainActivity)activity).hideUploader(); 
     List<Student> students= StudentJasonParser.getObjectFromJason(s); 
     if (students != null) { 

        ((MainActivity) activity).DisplyOnTextView(students); 
     } 
    } 
} 

這一行:((MainActivity)activity).DisplyOnTextView(students);

將所獲取的數據返回到主類的功能(在主類中提到! )

public void DisplyOnTextView(List<Student> students) { 

     List <Student> my = students ; 

    } 

現在我想要的是這個列表傳遞給下面的類,以便在viewPager,而不是在類中預先定義的數據的ImageView和TextView中使用它:

public class CustomAdapter extends PagerAdapter { 

    private int[] images = {R.drawable.sample_0,R.drawable.sample_1}; 
    private Context ctx; 
    private LayoutInflater LayoutInflater; 

    public CustomAdapter(Context ctx) 
    { 
     this.ctx=ctx; 
    } 

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

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

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 



     LayoutInflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View view = LayoutInflater.inflate(R.layout.slide_layout,container,false); 
     ImageView imageView =(ImageView) view.findViewById(R.id.image_view); 
     TextView textView = (TextView)view.findViewById(R.id.image_count); 
     imageView.setImageResource(images[position]); 

     textView.setText(""+position); 
     container.addView(view); 
     return view; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((LinearLayout) object); 
    } 



} 

有什麼想法?

謝謝,問候。

+0

沒有看到代碼,'新CustomAdapter的其餘部分(的getContext(),列表)'是一個好的開始的[自定義適配器列表視圖] –

+0

可能的複製(HTTP://計算器。com/questions/8166497/custom-adapter-for-list-view) –

+0

在給定的鏈接中,他擴展了CustomAdapter類中的ArrayAdapter ,但h已經擴展了pagerAdapter,正如你所知,我們不能擴展兩個clas!你可以幫我嗎 ! – MSMC

回答

1

我想要的是這個列表傳遞給下面的類,以使用它在的ImageView和TextView的在viewPager

然後,只需在列表中作爲參數傳遞到適配器和爲它添加一個成員變量。這個適配器的用法在這篇文章的底部,因爲我想提一些其他的東西。

class CustomAdapter extends PagerAdapter { 
    private Context ctx; 
    private List<Student> data; 

    public CustomAdapter(Context ctx, List<Student> students) { 
     this.ctx = ctx; 
     this.data = students; 
    } 

如果你想使用data變量在instantiateItem方法,那麼你可以做Student s = this.data.get(position);和使用Student對象上的各種方法來加載TextViewImageView


請注意,您將需要一個圖像加載庫(畢加索,滑翔,壁畫等)的URL加載到ImageView。儘管在圖書館這個話題上,通過查看Gson的JSON解析和Retrofit或者使用JSON數據的HTTP網絡調用的Volley,你將節省大量的開發時間。


至於你的AsyncTask的使用,繞過Activity變量是不好的做法。嘗試使用對Activity的異步回調。

public interface AsyncResponse<T> { 
    void onResponse(T response); 
} 
public class ConnectionAsyncTask extends AsyncTask<String, Void, List<Student>> { 

    private AsyncResponse<List<Student>> callback; 

    public ConnectionAsyncTask(AsyncResponse<List<Student>> callback) { 
     this.callback = callback; 
    } 

    @Override 
    protected List<User> doInBackground(String... params) { 
     String url = params[0]; 
     final List<Student> students = new ArrayList<Student>(); 

     // TODO: JSON stuff 
     return students; 
    } 

    @Override 
    protected void onPostExecute(List<Student> result) { 
     if (this.callback != null) { 
      this.callback.onResponse(result); 
     } else { 
      Log.w("ConnectionAsyncTask", "Ignoring result"); 
     } 
    } 
} 
public class SampleViewPagerActivity extends Activity { 

    private ViewPager pager; 
    private PagerAdapter adapter; 
    private ArrayList<Student> students; 
    private ProgressDialog progress; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // 1. Inflate a layout 
     setContentView(R.layout.viewpager_activity); 

     // 2. Initialize the views 
     this.pager = (ViewPager) findViewById(R.id.pager); 
     this.progress = new ProgressDialog(this); 
     this.progress.setTitle("Loading"); 
     this.progress.setMessage("Please wait"); 

     // 3. Populate the views with data 
     this.students = new ArrayList<Student>(); 
     this.adapter = new CustomAdapter(this, students); 
     this.pager.setAdapter(adapter); 

     // This code runs later, after 'execute' is called and the response is returned 
     ConnectionAsyncTask task = new ConnectionAsyncTask(new AsyncResponse<List<Student>>() { 
      @Override 
      public void onResponse(List<Student> response) { 
       students.clear(); 
       students.addAll(response); 
       adapter.notifyDataSetChanged(); 

       progress.hide(); 
      } 
     }); 

     // Optionally show some progress while waiting 
     this.progress.show(); 

     // TODO: Use real URL 
     task.execute("http://www.somesite.com/data"); 
    } 
}