如何调用和回调活动以运行API并制作列表?

时间:2017-05-14 10:15:39

标签: android android-recyclerview

我遇到了回调activity的问题,作为主要活动。我的故事是,我从一个API获得了一个分支列表,然后我将列表传递回活动以制作RecyclerView。

我应该说TextView我没有问题,例如,显示一个项目,但调试此行时出现此错误:

branchRecyclerView.setAdapter(branchAdapter);

错误是:

  

只有创建视图层次结构的原始线程才能触及它   视图。

修改

使用Runnable方法有一个solution。但由于以下原因,我不知道如何使用它:

  1. 我使用WebApi通过使用OkHttp获取信息。此库的OnResponse返回void,因此我应该在Activity_Main中回调一个方法来创建列表。

  2. 为了解决No.1,我将Main_Activity变量作为构造函数参数传递给该类。

  3. 我想在Runnable中使用activity_main作为解决方案从我的API类创建对象并调用我的API

  4. No.3中的构造函数只接受参数作为Runnable类!所以我不能将this传递给它,我必须传递任何东西!所以我得到这个错误: 不兼容的类型:<匿名Runnable>无法转换为MainActivity

  5. 我的代码(减少一些):

    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();
        }
    }
    

1 个答案:

答案 0 :(得分:0)

最后,我得到了我的代码的问题。我认为绑定发生在创建源并注入视图之后,但我误解了!它应该在调用从API获取数据的方法之前绑定。通过在其他方法中绑定,它会耗尽主线程。所以它与Runnable类无关!

将这些代码从generateBranchList移至OnCreate,问题就解决了。

RecyclerView.LayoutManager branchLayoutManager;
branchRecyclerView = (RecyclerView) findViewById(R.id.branchRecycleView);
branchLayoutManager = new LinearLayoutManager(this);
branchRecyclerView.setLayoutManager(branchLayoutManager);