2016-04-07 19 views
0

Bu kitaplığı https://github.com/ShirwaM/Simplistic-RSS uygulamaya çalışıyorum.ListView ve ArrayAdpater'ı başka bir sınıfa iletme

Kitaplık açıklandığı gibi yapar, ancak besleme çıktısının nasıl işleneceğini sevmiyorum. Temel olarak ana aktivitede özel bir sınıfın içinde doğrudan ListView ve ArrayAdapter'ı çağırır. Bu, iki özet akışını gösteren iki ListView’in olmasını istiyorsam, tüm özel sınıfı çoğaltmak zorunda olduğum anlamına gelir. Yapmak istediğim, bir ArrayAdapater ve ListView'in kabul edilmesini sağlamaktır, böylece bu sınıfı kapatabilir ve ardından ilgili feed URL'sini ve çıktı için ListView'i iki kez çağırabilirim.

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 


public class MainActivity extends Activity 
{ 
    private ListView mList; 
    private ListView lList; 
    ArrayAdapter<String> adapter; 
    ArrayAdapter<String> adapterSecond; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.rss_layout); 

     lList = (ListView) findViewById(R.id.listTwo); 
     mList = (ListView) findViewById(R.id.listOne); 

     adapterSecond = new ArrayAdapter<String>(this, R.layout.basic_list_item); 
     adapter = new ArrayAdapter<String>(this, R.layout.basic_list_item); 
     new GetRssFeed().execute("http://feeds.arstechnica.com/arstechnica/index"); 
     new GetRssFeedSecond().execute("http://feeds.skynews.com/feeds/rss/home.xml"); 
    } 

    private class GetRssFeed extends AsyncTask<String, Void, Void> 
    { 
     @Override 
     protected Void doInBackground(String... params) 
     { 
      try 
      { 
       RssReader rssReader = new RssReader(params[0]); 
       Integer i = 0; 
       for (RssItem item : rssReader.getItems()) 
       { 
        adapter.add(item.getTitle()); 
        i++; 
        if(i == 7) 
        { 
         break; 
        } 
       } 

      } catch (Exception e) 
      { 
       Log.v("Error Parsing Data", e + ""); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) 
     { 
      super.onPostExecute(aVoid); 
      adapter.notifyDataSetChanged(); 
      mList.setAdapter(adapter); 
     } 
    } 

    private class GetRssFeedSecond extends AsyncTask<String, Void, Void> 
    { 
     @Override 
     protected Void doInBackground(String... params) 
     { 
      try 
      { 
       RssReader rssReader = new RssReader(params[0]); 
       Integer i = 0; 
       for (RssItem item : rssReader.getItems()) { 
        adapter.add(item.getTitle()); 
        i++; 
        if (i == 7) { 
         break; 
        } 

       } 
      } catch (Exception e) 
      { 
       Log.v("Error Parsing Data", e + ""); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) 
     { 
      super.onPostExecute(aVoid); 
      adapterSecond.notifyDataSetChanged(); 
      lList.setAdapter(adapterSecond); 
     } 
    } 

} 

GetRssFeed Simplistic-RSS örnek kod uyarınca, Adaptörü ve ListView ile kodlanmış olduğundan Gördüğünüz gibi, iki farklı listviews oluşturmak için iki GetRssFeed sınıfları oluşturmak gerekir. Bunu yapmak istediğim bir GetRssFeed var, sadece ilgili Bağdaştırıcıya ve ListView'e iletilmek üzere arayabilirim.

+0

diyoruz,

new GetRssFeed("http://feeds.arstechnica.com/arstechnica/index", listView).execute(); 

Sizin tek AsyncTask şöyle görünecek, aşağıda gibi çağrı Veriler Aktiviteye geri dönmek için döndüğünde AsyncTask'ta bir arabirim geri çağrısı kullanın. Bir AsyncTask'taki Görünümler üzerinde tutulması –

+0

@MikeM dezavantajlarına sahiptir. Bağdaştırıcıyı ListView'de nasıl ayarlıyorsunuz? – jskrwyk

cevap

1

GetRssFeed Sınıfı içinde, bağdaştırıcıyı değiştirmek isterseniz aşağıdaki gibi 3 parametre ekleyin, 2 parametre, url ve liste görünümünü kabul eden bir kurucu ekleyin.

Bu değişkenleri GetRssFeed sınıfının içinde örnek değişkenleri olarak tanımlayın ve bunları kullanın.

sonra, onCreate dan, sen

private class GetRssFeed extends AsyncTask<String, Void, Void> 
{ 
    ListView listView; 
    String url; 
    ArrayAdapter adapter; 

    public GetRssFeed(String url, ListView listView, ArrayAdapter adapter) { 
     this.listView = listView; 
     this.url = url; 
     this.adapter = adapter; 
    } 
    @Override 
    protected Void doInBackground(String... params) 
    { 
     try 
     { 

      Log.d("tag", "nayana url "+url); 
      RssReader rssReader = new RssReader(params[0]); 
      Integer i = 0; 
      for (RssItem item : rssReader.getItems()) 
      { 
       adapter.add(item.getTitle()); 
       i++; 
       if(i == 7) 
       { 
        break; 
       } 
      } 

     } catch (Exception e) 
     { 
      Log.v("Error Parsing Data", e + ""); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) 
    { 
     super.onPostExecute(aVoid); 
     adapter.notifyDataSetChanged(); 
     mList.setAdapter(adapter); 
    } 
} 

onCreate itibaren, Yapabilirsin

new GetRssFeed("http://feeds.arstechnica.com/arstechnica/index", lList, ADAPTER).execute(); 
    new GetRssFeed("http://feeds.skynews.com/feeds/rss/home.xml", mList, adapterSECOND).execute(); 
+0

Biçimlendirmeyi denedim ancak bir sınıf olduğu için ASyncTask uzantıyı sevmiyor. – jskrwyk

+0

özür dilerim, 'Denedim ve iyi çalışıyor' diyerek bir hata veriyor. Cevap beklerim cevabımı düzenlerim –

+1

@JamesKrawczyk, AsyncTask'da kurucu ekleyerek çalışıyor. Lütfen düzenlediğim cevabımı kontrol edin –