我在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
方法。
编辑-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
建议之后,我在MainActivity.onCreate
方法中调用MainActivity.onCreate
,并将getWarehouse()
的定义复制到MainActivity.class
。
也是我的MainActivity.getWarehouse.onNext
方法:
@Override
public void onNext(List<Warehouse> response) {
mAdapter.addItems(response);
}
其中mAdapter
是private StaggeredGridAdapter mAdapter;
,稍后在MainActivity.onCreate
方法中初始化。
addItems
方法在StaggeredGridAdapter
类中的定义是什么?
编辑-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);
}
}
发布于 2015-10-19 10:34:54
我会把getWarehouse()
留在Activity
里。在相同的活动中,可以保持对StaggeredGridAdapter的引用,就像对mRecyclerView的引用一样。在适配器中创建一个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
是您在适配器( dataset)中使用的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();
}
}
发布于 2015-10-19 09:53:47
与其在getWarehouse方法中订阅,不如让getWarehouse返回可观察性并在适配器中执行订阅部分。这样,您就可以让onNext回调存在于适配器中,而不是在调用方法中。理想情况下,您应该只实例化well适配器一次,而不是每次都在getWarehouse方法中实例化。
public Observable<Warehouse> getWarehouse(){
adapter.getWarehouse()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
}
从适配器执行以下操作:someClass.getWarehouse().subscribe(new Subscriber()....)
https://stackoverflow.com/questions/33220742
复制相似问题