问题描述
我在Wrapper
类中定义了以下方法来进行Rest
调用。
public void getWarehouse(){
//Generation of RestAdapter
RestAdapter adapter = new RestAdapter.Builder ()
.setEndpoint(URL)
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
//Making request to API
adapter.create(WarehouseAPI.class).getWarehouse()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<Warehouse>>() {
@Override
public void onCompleted() {
Log.d(this.getClass().getName(), "OnCompleted()");
}
@Override
public void onError(Throwable e) {
Log.d(this.getClass().getName(), "Error: " + e.toString());
}
@Override
public void onNext(List<Warehouse> response) {
}
});
}
上面的代码工作正常,我得到了预期的答复。
但是我需要从Adapter class
调用此方法。
我怎样才能做到这一点?
有什么方法可以使用onNext
方法吗?
我是Android rx-java
和Retrofit
初学者。
编辑1
我正在使用staggeredGridView
来显示数据。
因此,在我的MainActivity
类中,我正在调用以下代码:
StaggeredGridAdapter adapter = new StaggeredGridAdapter(this);
mRecyclerView.setAdapter(adapter);
要在StaggeredGridView holder
getWarehouse
填充数据,我必须调用getWarehouse
方法。
编辑2
MainActivity的onCreate()
方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
getWarehouse();
mRecyclerView = (RecyclerView) findViewById(R.id.staggering_grid);
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
StaggeredGridAdapter adapter = new StaggeredGridAdapter(this);
mRecyclerView.setAdapter(adapter);
GridItemSpaces decoration = new GridItemSpaces(10);
mRecyclerView.addItemDecoration(decoration);
}
其中StaggeredGridAdapter
是:
public class StaggeredGridAdapter extends RecyclerView.Adapter<StaggeredGridAdapter.StaggeredGridView>{}
编辑3
提出建议后,我致电getWarehouse();
在MainActivity.onCreate
方法中,并将getWarehouse()
的定义复制到MainActivity.class
。
还有我的MainActivity.getWarehouse.onNext
方法:
@Override
public void onNext(List<Warehouse> response) {
mAdapter.addItems(response);
}
其中mAdapter
是private StaggeredGridAdapter mAdapter;
稍后在MainActivity.onCreate
方法中对其进行初始化。
StaggeredGridAdapter
类中addItems
方法的定义是什么?
编辑4
StaggeredGridAdapter
完整定义
public class StaggeredGridAdapter extends RecyclerView.Adapter<StaggeredGridAdapter.StaggeredGridView> {
private Context context;
private List<Warehouse> warehouses = new ArrayList<Warehouse>();
int size;
public StaggeredGridAdapter(Context context) {
this.context = context;
}
public void addItems(List<Warehouse> response){
size = response.size();
warehouses = response;
}
@Override
public StaggeredGridView onCreateViewHolder(ViewGroup parent, int viewType) {
View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_item, parent, false);
StaggeredGridView staggeredGridView = new StaggeredGridView(layoutView);
return staggeredGridView;
}
@Override
public void onBindViewHolder(StaggeredGridView holder, int position) {
holder.textView.setText(warehouses.get(position).getFace());
}
@Override
public int getItemCount() {
return size;
}
class StaggeredGridView extends RecyclerView.ViewHolder {
TextView textView;
public StaggeredGridView(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.img_name);
}
}
1楼
让getWarehouse返回可观察对象并在适配器中进行预订,而不是在getWarehouse方法中进行预订。 这样,您可以使onNext回调存在于适配器中,而不存在于调用方法中。 理想情况下,您只应该在getWarehouse方法中实例化一次restadapter,而不是每次都实例化。
public Observable<Warehouse> getWarehouse(){
adapter.getWarehouse()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
}
从适配器执行此操作: someClass.getWarehouse().subscribe(new Subscriber()....)
2楼
我将把getWarehouse()
留在Activity
。
在同一活动中,您可以像使用mRecyclerView一样保留对StaggeredGridAdapter的引用。
在适配器中创建一个public void addItems(List<Warehouse> response)
,然后在调用onNext时只需执行mAdapter.addItems(response)
例如
public void addItems(List<Warehouse> items) {
int oldSize = mDataSet.size();
synchronized(mDataSet) {
mDataSet.addAll(items);
}
notifyItemRangeInserted(oldSize - 1, mDataSet.size() - 1);
}
我假设mDataSet
是您在适配器(数据集)中使用的Collection
的名称。
我也避免实例化
RestAdapter adapter = new RestAdapter.Builder ()
.setEndpoint(URL)
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
每次调用getWarehouse();
。
subscribe
回报Subscription
对象。
将其保留为成员变量,并在ondDestroy中取消订阅
@Override
protected void onDestroy() {
super.onDestroy();
if (mSubscription != null) {
mSubscription.unsubscribe();
}
}