如何将 Retrofit onResponse 数据传递给 Activity?
How to pass Retrofit onResponse Data to an Activity?
我想将改造响应传递给 Activity 以便我可以在 recyclerview 适配器中设置数据。我不想使用 LiveData 或 RxJava。
这里 imageDetails 是 Json 对象的列表,我想将它传递给 MainActivity.
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
编辑:一切正常,但在调用所有默认函数后我的列表正在更新。
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
}
}
您可以使用传递您想要的方法作为功能参数调用,请在下面尝试 fetchGifs 在 MainActivity[= 中接受一个方法作为参数 & 16=] 我们将 adapter.setListData 作为参数传递给它
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))
}}
1- 在您的 activity 添加:
public class MainActivity extends AppCompatActivity implements Observer {
....
}
2- 在 activity
:
中实现方法 update()
@Override
public void update(Observable o, Object arg) {
}
3- 创建一个 Observable 对象:
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- 在你的 activity onResume()
添加这一行:
RetrofitObservable.getInstance().addObserver(this);
5- 在你的 activity onPause()
添加这一行:
RetrofitObservable.getInstance().deleteObserver(this);
6- 在您的 Retrofit 响应中,调用此行:
RetrofitObservable.getInstance(). notifyObserverWithResponse(yourResponseHere);
7- 在您的 activity update
方法中,处理您的响应:
@Override
public void update(Observable o, Object arg) {
YourRetrofitResponse response = (YourRetrofitResponse) arg;
// make your changes here
}
我想将改造响应传递给 Activity 以便我可以在 recyclerview 适配器中设置数据。我不想使用 LiveData 或 RxJava。 这里 imageDetails 是 Json 对象的列表,我想将它传递给 MainActivity.
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
编辑:一切正常,但在调用所有默认函数后我的列表正在更新。
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
}
}
您可以使用传递您想要的方法作为功能参数调用,请在下面尝试 fetchGifs 在 MainActivity[= 中接受一个方法作为参数 & 16=] 我们将 adapter.setListData 作为参数传递给它
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))
}}
1- 在您的 activity 添加:
public class MainActivity extends AppCompatActivity implements Observer {
....
}
2- 在 activity
:
update()
@Override
public void update(Observable o, Object arg) {
}
3- 创建一个 Observable 对象:
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- 在你的 activity onResume()
添加这一行:
RetrofitObservable.getInstance().addObserver(this);
5- 在你的 activity onPause()
添加这一行:
RetrofitObservable.getInstance().deleteObserver(this);
6- 在您的 Retrofit 响应中,调用此行:
RetrofitObservable.getInstance(). notifyObserverWithResponse(yourResponseHere);
7- 在您的 activity update
方法中,处理您的响应:
@Override
public void update(Observable o, Object arg) {
YourRetrofitResponse response = (YourRetrofitResponse) arg;
// make your changes here
}