我遇到了回调activity
的问题,作为主要活动。我的故事是,我从一个API获得了一个分支列表,然后我将列表传递回活动以制作RecyclerView。
我应该说TextView
我没有问题,例如,显示一个项目,但调试此行时出现此错误:
branchRecyclerView.setAdapter(branchAdapter);
错误是:
只有创建视图层次结构的原始线程才能触及它 视图。
修改
使用Runnable
方法有一个solution。但由于以下原因,我不知道如何使用它:
我使用WebApi
通过使用OkHttp获取信息。此库的OnResponse
返回void,因此我应该在Activity_Main中回调一个方法来创建列表。
为了解决No.1,我将Main_Activity变量作为构造函数参数传递给该类。
我想在Runnable
中使用activity_main
作为解决方案从我的API类创建对象并调用我的API
No.3中的构造函数只接受参数作为Runnable
类!所以我不能将this
传递给它,我必须传递任何东西!所以我得到这个错误:
不兼容的类型:<匿名Runnable>无法转换为MainActivity
我的代码(减少一些):
Main_Activity:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
CentralAPIs api = new CentralAPIs();
api.run();
} catch (Exception e1) {
e1.printStackTrace();
}
}
public void generateBranchList(List<BranchModel> branches) {
RecyclerView branchRecyclerView;
RecyclerView.Adapter branchAdapter;
RecyclerView.LayoutManager branchLayoutManager;
branchRecyclerView = (RecyclerView) findViewById(R.id.branchRecycleView);
try {
branchLayoutManager = new LinearLayoutManager(this);
branchRecyclerView.setLayoutManager(branchLayoutManager);
} catch (Exception ex) {
ex.printStackTrace();
}
}
CentralAPI
MainActivity activity;
public CentralAPIs(MainActivity activity){
this.activity = activity;
}
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful())
throw new IOException("Unexpected code " + response);
Headers responseHeaders = response.headers();
for (int i = 0, size = responseHeaders.size(); i < size; i++) {
System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
}
Gson gson = new GsonBuilder()
.setLenient()
.create();
try {
List<BranchModel> branches = gson.fromJson(response.body().charStream(),ArrayList.class);
//********** HERE CALLBACK ACTIVITY METHOD ****************
activity.generateBranchList(branches);
} catch (Exception ex) {
ex.printStackTrace();
}
适配器
public class BranchAdapter extends RecyclerView.Adapter<BranchAdapter.BranchViewHolder>{
private List<BranchModel> branchList;
public static class BranchViewHolder extends RecyclerView.ViewHolder {
public View currentView;
public BranchViewHolder(View currentView) {
super(currentView);
this.currentView = currentView;
}
}
public BranchAdapter(List<BranchModel> branchList) {
this.branchList = branchList;
}
@Override
public BranchViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.activity_main, viewGroup, false);
BranchViewHolder pvh = new BranchViewHolder(v);
return pvh;
}
@Override
public int getItemCount() {
return branchList.size();
}
}
答案 0 :(得分:0)
最后,我得到了我的代码的问题。我认为绑定发生在创建源并注入视图之后,但我误解了!它应该在调用从API获取数据的方法之前绑定。通过在其他方法中绑定,它会耗尽主线程。所以它与Runnable类无关!
将这些代码从generateBranchList
移至OnCreate
,问题就解决了。
RecyclerView.LayoutManager branchLayoutManager;
branchRecyclerView = (RecyclerView) findViewById(R.id.branchRecycleView);
branchLayoutManager = new LinearLayoutManager(this);
branchRecyclerView.setLayoutManager(branchLayoutManager);