java - 没有附加适配器,在 fragment 中使用 reyclerview 和 json 跳过布局

标签 java android json android-fragments android-adapter

我确定 json 一切正常,但我认为我没有将 setAdapter() 放在合适的位置。那么我在哪里犯错了?或者我在其他地方犯了一个错误。任何帮助,将不胜感激。 这是代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.gifts_activity, container, false);
    dbh = new DBHelper(getActivity());
    avLoadingIndicatorView = (AVLoadingIndicatorView)
            v.findViewById(R.id.avloadingIndicatorView);
    recyclerView = (RecyclerView) v.findViewById(R.id.recycler_view);
    recyclerView.addItemDecoration(new SimpleDividerItemDecoration(getActivity().getResources()));

    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    giftItemSorter = new GiftItemSorter();
    int birthdayId = getActivity().getIntent().getIntExtra(EditBirthday.KEY_EXTRA_BIRTHDAY_ID, 0);
    Cursor rs = dbh.getBirthdayId(birthdayId);
    rs.moveToFirst();

    new AsyncHttpTask().execute(url);

    if (!rs.isClosed()) {
        rs.close();}

    return v;
}

void startAnim(){
    avLoadingIndicatorView.setVisibility(View.VISIBLE);
}

void stopAnim(){
    avLoadingIndicatorView.setVisibility(View.GONE);
}

public class AsyncHttpTask extends AsyncTask<String, Void, Integer> {

    @Override
    protected void onPreExecute() {
        startAnim();
    }

    @Override
    protected Integer doInBackground(String... params) {
        Integer result = 0;
        HttpURLConnection urlConnection;
        try {
            URL url = new URL(params[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            int statusCode = urlConnection.getResponseCode();

            // 200 represents HTTP Ok
            if (statusCode == 200) {
                BufferedReader r = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = r.readLine()) != null) {
                    response.append(line);
                }
                parseResult(response.toString());
                result = 1; // Successful
            } else {
                result = 0; //"Failed to fetch data!";
            }
        } catch (Exception e) {
            Log.d(TAG, e.getLocalizedMessage());
        }
        return result; //"Failed to fetch data!";
    }
    @Override
    protected void onPostExecute(Integer result) {
        // Download complete. Let us update UI
        stopAnim();

        if (result == 1) {
            giftListAdapter = new GiftListAdapter(getActivity(), gifts);
            reyclerView.setAdapter(giftListAdapter);
        } else {
            SuperActivityToast.create(getActivity(), getString(R.string.err_msg_no_internet),
                    SuperToast.Duration.SHORT, Style.getStyle(Style.RED, SuperToast.Animations.FLYIN)).show();
        }
    }
}

private void parseResult(String result) {
    try {
        JSONObject response = new JSONObject(result);
        JSONArray movies = response.optJSONArray("movies");
        gifts = new ArrayList<>();

        for (int i = 0; i < movies.length(); i++) {
            JSONObject post = movies.optJSONObject(i);
            GiftItem item = new GiftItem();
            item.setThumbnail(post.optString("image"));
            item.setTitle(post.optString("title"));
            item.setDescription(post.optString("description"));
            item.setSource(getString(R.string.source) + " " + post.optString("source"));
            item.setTotalRating(post.optInt("rating"));
            item.setPrice(post.optDouble("price"));

            gifts.add(item);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

最佳答案

您的 fragment View 是在 onCreateView 方法中创建的,并且由于您在 View 创建期间没有在 RecyclerView 上设置适配器,所以您会看到红色错误行: 没有附加适配器,跳过布局

尝试在 onCreateView 方法中为 RecyclerView 设置一个适配器:传入一个空的 gifts 数组:

// Supposing that you declared the gifts arraylist as a member variable
gifts = new ArrayList<>();

giftListAdapter = new GiftListAdapter(getActivity(), gifts);
reyclerView.setAdapter(giftListAdapter);

关于java - 没有附加适配器,在 fragment 中使用 reyclerview 和 json 跳过布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34181205/

相关文章:

android - 使用 Android 和 Arduino 发送和接收数据

android - 如何在kotlin中通过蓝牙接收字符串

json - 如何在 swift 4 中从多个字典写入多个 JSON 对象

c# - 反序列化 JSON 凭证数据时出错。谷歌云文件上传 C# Asp.Net

java - Libgdx 让灯光忽略 body

java - Spring bean 启动时为 null

java - 替换导致 Android 中的外键不匹配

java - Swift 在 Kotlin(或 Java)中的结构?同一类的多个实例,改变其变量

java - Java 对象中的 JSON 值

java - C++:普遍使用 shared_ptr<> 是否等同于 gc?