列表中没有添加项目<object>在AsyncTask中获取Json时

时间:2016-03-02 17:23:00

标签: java android

我有一个RecyclerView,异步任务,Json文件。

我想要的: 获取Json并为每个循环添加一个项目。

我的问题: 我得到了json,然后循环,但是&#34; List.add(Item)&#34;没有添加任何行,所以回收者是空的。

代码:

Adapter RcAdapter;
public static List<CatItem> Items;
String DATA_URL;
@SuppressLint("InflateParams")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LinLayout = (LinearLayout) inflater.inflate(R.layout.cat_recycler,
            container, false);
    setHasOptionsMenu(true);

    DATA_URL = this.getArguments().getString(MainActivity.DATA);
    initListViews();
    return LinLayout;
}

    private void initListViews() {
    List<CatItem> rowListItem = getAllItemList();
    LinearLayoutManager gridLayout = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);

    RecyclerView RcView = (RecyclerView) LinLayout.findViewById(R.id.cat_rv);

    RcView.setHasFixedSize(true);
    RcView.setLayoutManager(gridLayout);
    RcAdapter = new Adapter(getActivity(), rowListItem);

    RcView.setAdapter(RcAdapter);
}

    private List<CatItem> getAllItemList() {

    Items = new ArrayList<>();

    new GetDevices().execute(DATA_URL);

    return Items;
}

class GetDevices extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Loading Devices, Please Wait..");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }


    protected String doInBackground(String... params) {

        return JsonUtils.getJSONString(params[0]);
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        if(pDialog != null)
            pDialog.dismiss();

        if(result == null){
            Toast.makeText(getActivity(),"Failed To Fetch Data, Please Refresh",Toast.LENGTH_LONG).show();
        } else {
            try {
                JSONObject MainJSON = new JSONObject(result);
                JSONArray DevicesArrays = MainJSON.getJSONArray("roms_center");

                for (int i = 0; i < DevicesArrays.length() ; i++){
                    CatItem Item = new CatItem();
                    JSONObject first = DevicesArrays.getJSONObject(i);

                    Log.LogInfo("I'm In Position " + i);

                    Item.setDevice_Name(first.getString("device_name"));
                    Item.setTotal_Downloads(first.getInt("roms_count"));
                    Item.setDevice_ID(first.getInt("device_id"));

                    Items.add(Item);
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}

问题是什么?

此外,在我的持有人中我实施了OnClick,并且我希望从被按下的位置获得一些东西,我使用以下方式:

Main.Items.get(getLayoutPosition()).getDevice_ID()

正如您所看到的,我获得了静态列表,有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:2)

这两行之间的程序流程并不像你想象的那样。

new GetDevices().execute(DATA_URL);
return Items;

GetDevices是一个AsyncTask,这意味着它将异步运行。 下一行中的return语句不会等待异步任务完成,并且它返回null,因为异步任务需要一段时间才能完成。

答案 1 :(得分:1)

在您将项目添加到列表后,您必须告诉您的适配器。所以你可以用两种方式做到这一点:

RcAdapter.notifyItemInserted(Items.size() - 1);
or
RcAdapter.notifyDataChanged();