2016-04-24 10 views
0

hoffen, dass Sie schön und gut,Passing Arraylist von AsyncTask PagerAdapter

Ich habe folgende Hauptklasse:

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 ; 

    }    
} 

wenn ich die app laufen, wird diese Haupttätigkeit eine andere Klasse verwenden JSON-Daten zu lesen wie folgt aus Link:

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; 
    } 
} 

jetzt diese Klasse werden die Daten auf die folgende Klasse zurückgeben:

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); 
     } 
    } 
} 

diese Zeile: ((MainActivity)activity).DisplyOnTextView(students);

werden die abgerufenen Daten an die Hauptklasse in der folgenden Funktion zurückzukehren (in der Hauptklasse erwähnt!

)
public void DisplyOnTextView(List<Student> students) { 

     List <Student> my = students ; 

    } 

jetzt, was ich will, ist diese Liste der folgenden Klasse übergibt, um es in der Imageview und Textview in dem viewPager anstelle der vordefinierten Daten in der Klasse zu verwenden:

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); 
    } 



} 

keine Idee?!

danke, grüße.

+0

, ohne den Rest des Codes zu sehen, 'neue CustomAdapter (getContext(), Liste)' ist ein guter Anfang –

+0

Mögliche Duplikat [Custom-Adapter für Listenansicht] (http: // Stapelüberlauf.com/questions/8166497/custom-adapter-for-list-view) –

+0

in der angegebenen link erweitert er ArrayAdapter in der CustomAdapter-Klasse, aber h erweitert bereits pagerAdapter, und wie Sie wissen, können wir zwei Klassen nicht erweitern! Kannst du mir bitte Helfen ! – MSMC

Antwort

1

, was ich will, ist diese Liste der folgenden Klasse übergeben, um es in der Imageview zu verwenden und Textview in der viewPager

Dann einfach in der Liste als Parameter an den Adapter übergeben und Fügen Sie eine Mitgliedsvariable hinzu. Die Verwendung dieses Adapters ist am Ende dieses Beitrags, weil ich einige andere Dinge erwähnen möchte.

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

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

Wenn Sie diese data Variable in der instantiateItem Methode verwenden möchten, dann können Sie Student s = this.data.get(position); tun und die verschiedenen Methoden auf dem Student Objekt verwenden, um die TextView oder ImageView zu laden.


Bitte beachten Sie, dass Sie ein Bild Laden Bibliothek benötigt (Picasso, Glide, Fresko, etc.) eine URL in eine ImageView zu laden. Beim Thema Bibliotheken sparen Sie jedoch viel Entwicklungszeit, indem Sie Gson für JSON-Parsing und Retrofit oder Volley für HTTP-Netzwerkaufrufe mit JSON-Daten untersuchen.


Wie für Ihre Nutzung der AsyncTask, um die Activity Variable vorbei ist eine schlechte Praxis. Versuchen Sie stattdessen, einen asynchronen Rückruf für die Aktivität zu verwenden.

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"); 
    } 
}