2017-12-25 16 views
-1

Ich möchte die Nachrüstantwort an Activity übergeben, damit ich Daten im Recyclerview-Adapter einstellen kann. Ich möchte LiveData oder RxJava nicht verwenden. Hier ImageDetails ist die Liste der Json Object und ich möchte es an MainActivity übergeben.Wie wird die Nachrüstung von onResponse-Daten an eine Aktivität übergeben?

TrendingViewModel.kt

class TrendingViewModel : ViewModel() { 

fun fetchGifs() { 
    val apiService = GiphyApi().getClient()?.create(ApiInterface::class.java) 
    val call = apiService?.getTrendingResults(20, Constants.API_KEY) 
    var imageDetails: List<ImageDetails> 


    call?.enqueue(object : retrofit2.Callback<GiphyResponse> { 

     override fun onResponse(call: Call<GiphyResponse>?, response: Response<GiphyResponse>?) { 
      imageDetails = response?.body()?.data!! 
     } 

     override fun onFailure(call: Call<GiphyResponse>?, t: Throwable?) { 
     } 
    }) 
}} 

MainActivity.kt

class MainActivity : AppCompatActivity() { 

private lateinit var layoutManager: RecyclerView.LayoutManager 
lateinit var adapter: RecyclerViewAdapter 
lateinit var trendingViewModel: TrendingViewModel 

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main) 
    val debugTree: Timber.DebugTree = Timber.DebugTree() 
    TrendingViewModel().fetchGifs() 
    Timber.plant(debugTree) 

    trendingViewModel = ViewModelProviders.of(this).get(TrendingViewModel::class.java) 
    trendingViewModel.fetchGifs() 
    layoutManager = GridLayoutManager(this, 3) as RecyclerView.LayoutManager 
    binding.recyclerview.layoutManager = layoutManager 
    adapter = RecyclerViewAdapter(this) 
    binding.recyclerview.adapter = adapter 
    adapter.setListData(//TODO I need the response data here) 

}} 

RecyclerViewAdapter.kt

Edit: Everthing arbeitet gut, aber meine Liste wird immer aktualisiert, nachdem Alle Standardeinstellungen Funktion wird aufgerufen.

class RecyclerViewAdapter(context: Context) : RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>(){ 


private var gifList: List<ImageDetails>? = Collections.emptyList() 
private var mContext: Context? = null 

init { 
    this.mContext = context 
} 

fun setListData(list: List<ImageDetails>) { 
    gifList=list 
    Log.i("Size SetListData", gifList!!.size.toString()) 

    //Here it is showing List size 20 
} 

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder? { 
    val binding = DataBindingUtil.inflate<RecyclerviewListItemBinding>(LayoutInflater.from(parent.context), R.layout.recyclerview_list_item, 
      parent, false) 

    return ViewHolder(binding) 

} 

override fun onBindViewHolder(holder: ViewHolder, position: Int) { 
    //val binding = holder.binding; 
    Log.i("Size SizeBindHolder",gifList?.size.toString()) 

    //Size = 0 

    /*Glide.with(mContext) 
      .load(gifList?.get(position)?.images?.dimen?.url) 
      .into(holder.imageView)*/ 

} 

override fun getItemCount(): Int { 
    Log.i("Size ItemCount",gifList?.size.toString()) 
    // Size = 0 
    return gifList?.size!! 
} 




class ViewHolder(var binding: RecyclerviewListItemBinding) : RecyclerView.ViewHolder(binding.root) { 
    var imageView: ImageView 

    init { 
     this.binding = binding 
     imageView = binding.imageView 
    } 
} 
+0

Erstellen Sie eine Funktion Daten zu aktualisieren, in Adapter. Nennen Sie es als Antwort. Und rufen Sie notifyDataSetChanged –

+0

Könnten Sie bitte erarbeiten? –

Antwort

0

Sie können Ihre gewünschte Methode übergeben, die als Funktionsparameter genannt werden muss, versuchen Sie unten hier fetchGifs akzeptiert eine Methode als Parameter & in MainActivity wir adapter.setListData es sind vorbei als

Parameter
class TrendingViewModel : ViewModel() { 

fun fetchGifs(callback: (giphyResponse: GiphyResponse) -> Any) { 
    val apiService = GiphyApi().getClient()?.create(ApiInterface::class.java) 
    val call = apiService?.getTrendingResults(20, Constants.API_KEY) 
    var imageDetails: List<ImageDetails> 


    call?.enqueue(object : retrofit2.Callback<GiphyResponse> { 

     override fun onResponse(call: Call<GiphyResponse>?, response: Response<GiphyResponse>?) { 
      imageDetails = response?.body()?.data!! 
      callback(imageDetails) 
     } 

     override fun onFailure(call: Call<GiphyResponse>?, t: Throwable?) { 
     } 
    }) 
}} 




class MainActivity : AppCompatActivity() { 

private lateinit var layoutManager: RecyclerView.LayoutManager 
lateinit var adapter: RecyclerViewAdapter 
lateinit var trendingViewModel: TrendingViewModel 

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main) 
    val debugTree: Timber.DebugTree = Timber.DebugTree() 
    Timber.plant(debugTree) 

    trendingViewModel = ViewModelProviders.of(this).get(TrendingViewModel::class.java) 
    trendingViewModel.fetchGifs() 
    layoutManager = GridLayoutManager(this, 3) as RecyclerView.LayoutManager 
    binding.recyclerview.layoutManager = layoutManager 
    adapter = RecyclerViewAdapter(this) 
    binding.recyclerview.adapter = adapter 
    TrendingViewModel().fetchGifs(result -> adapter.setListData(result)) 


}} 
+0

Hey @Akhil Es funktioniert wie ein Charme, danke Mann. Aber ich habe eine Frage Ich bekomme vollständige Liste im Adapter, aber nicht in der Lage, Größe in getItemCount() -Methode zu bekommen. Wie mache ich es ? –

+0

In setListData sollten Sie Ihre Listendaten aktualisieren & in getItemCount sollte die Größe der aktualisierten Liste zurückgeben – Akhil

+0

Ich habe die Liste von setListData aktualisiert, aber diese Methode wird nach all den überschriebenen Methoden aufgerufen, so dass die Liste aktualisiert wird, nachdem alle Standardmethoden aufgerufen wurden. –

0

1- in Ihrer Aktivität hinzufügen:

public class MainActivity extends AppCompatActivity implements Observer { 
     .... 
    } 

2- implementieren die Methode update() in Ihrem activity:

@Override 
    public void update(Observable o, Object arg) { 


    } 

3- ein beobachtbares Objekt erstellen:

public class RetrofitObservable extends Observable { 

    private static RetrofitObservable instance = null; 

    public static RetrofitObservable getInstance() { 

     if(instance == null) { 

      instance = new RetrofitObservable(); 

     } 

     return instance; 
    } 

    public void notifyObserverWithResponse(Object response) { 

     setChanged(); 

     notifyObservers(response); 

    } 

} 

4- in Ihrer Tätigkeit onResume() diese Zeile hinzufügen:

RetrofitObservable.getInstance().addObserver(this); 

5- in Ihrer Aktivität onPause() diese Zeile hinzufügen:

RetrofitObservable.getInstance().deleteObserver(this); 

6- im Retrofit Antwort, diese Zeile nennen:

RetrofitObservable.getInstance(). notifyObserverWithResponse(yourResponseHere); 

7- in Ihrer Tätigkeit update Methode behandeln Ihre Antwort:

@Override 
public void update(Observable o, Object arg) { 

    YourRetrofitResponse response = (YourRetrofitResponse) arg; 

    // make your changes here 

} 
+0

Hey Mann Danke für die Antwort, obwohl ich noch nicht ausprobiert habe, weil ich @ Akhils Antwort einfacher fand. Trotzdem danke. –

Verwandte Themen