【问题标题】:Android: Displaying Data of AsyncTask in RecyclerViewAndroid:在 RecyclerView 中显示 AsyncTask 的数据
【发布时间】:2017-01-26 18:22:15
【问题描述】:

我又来了:/ 我尝试设置一个 AsyncTask。 这是我的代码,我在其中设置 AsyncTask 的片段活动:

public class HomeFragment extends Fragment {

// RecyclerView
RecyclerView recyclerView;
RecyclerView.Adapter rvAdapter;
RecyclerView.LayoutManager rvLayoutManger;
List<NewsData> news_list;



@Nullable
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.activity_home, null);

    // RecyclerView Setup
    recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view1);
    rvLayoutManger = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(rvLayoutManger);
    rvAdapter = new HomeRecyclerAdapter(getActivity(), news_list);
    recyclerView.setAdapter(rvAdapter);
    news_list = new ArrayList<>();

    load_data_from_server(0);

    return view;
}

private void load_data_from_server(int id) {
    AsyncTask<Integer, Void, Void> task = new AsyncTask<Integer, Void, Void>() {
        @Override
        protected Void doInBackground(Integer... integers) {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder().url("http://here is my url ").build();
            try {
                Response response = client.newCall(request).execute();

                JSONArray array = new JSONArray(response.body().toString());

                for (int i = 0; i < array.length(); i++) {
                    JSONObject object = array.getJSONObject(i);

                    NewsData data = new NewsData(object.getInt("id"), object.getString("title"), object.getString("describtion"));
                    news_list.add(data);

                }

            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                System.out.print("End of  content");
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            rvAdapter.notifyDataSetChanged();
        }
    };

    task.execute(id);
}



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

我想在我的 RecyclerView 中显示标题,所以在 RecyclerAdapter 中:

public class HomeRecyclerAdapter extends RecyclerView.Adapter<HomeRecyclerAdapter.ViewHolder> {

private Context context;
private List<NewsData> news_list;

public HomeRecyclerAdapter(Context context, List<NewsData> news_list) {
    this.context = context;
    this.news_list = news_list;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_cardviewhome, parent, false);

    return new ViewHolder(itemView);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {

    holder.title.setText(news_list.get(position).getTitle());

}

@Override
public int getItemCount() {

    return news_list.size();
}


public class ViewHolder extends RecyclerView.ViewHolder{
    public TextView title;

    public ViewHolder(View itemView){
        super(itemView);
        title = (TextView) itemView.findViewById(R.id.title_cView);


    }
}

要传输我的数据,我使用 Getters 和 Setters:

public class NewsData {

private int id;
private String title, describtion;

public NewsData(int id, String title, String describtion){
    this.id = id;
    this.title = title;
    this.describtion = describtion;
}


public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getTitle(){
    return title;
}

public void  setTitle(String title){
    this.title = title;
}

public String getDescribtion(){
    return describtion;
}

public void setDescribtion(String describtion) {
    this.describtion = describtion;
}

但是现在我遇到的问题是,当我运行它时,它会崩溃。它崩溃是因为

NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
                  at com.example.andreundjulia.test.Adapters.HomeRecyclerAdapter.getItemCount(HomeRecyclerAdapter.java:53)

可能有人知道该怎么做或这里出了什么问题吗?我真的无法继续:/我希望你们能理解我的英语,它不是很好,但是我已经想感谢你们,因为你们点击了这个帖子并试图提供帮助 :-)

【问题讨论】:

    标签: java android android-asynctask android-recyclerview


    【解决方案1】:

    您正在使用空列表将数据设置到适配器中:rvAdapter = new HomeRecyclerAdapter(getActivity(), news_list);。然后在下面初始化news_list = new ArrayList&lt;&gt;()。将初始化移到适配器创建之前。

    【讨论】:

    • 哇,真的这么简单 :D 谢谢你,但它仍然不会显示你也许知道为什么?
    【解决方案2】:

    你永远不会初始化你 news_list,因此,当你调用 rvAdapter = new HomeRecyclerAdapter(getActivity(), news_list); 时,你会得到一个空引用。

    你需要先进行初始化:

    List<NewsData> news_list = new ArrayList<>();
    

    【讨论】:

      【解决方案3】:

      在片段的 oncreateview 中,您需要在设置适配器之前初始化 arraylist

      【讨论】:

        猜你喜欢
        • 2021-06-02
        • 2020-08-21
        • 1970-01-01
        • 2017-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多