Fragment,Volley and RecyclerView JSON

问题描述 投票:0回答:2

我希望那里的人能帮助我解决我的问题。我有一个使用该片段的Android应用程序。我想使用Volley从JSON文件下载数据。该程序不会抛出任何错误,但是CardView不会显示订购的数据。我查看了具有类似问题的其他主题,但坐了很长时间,却没有任何反应。

AdapterZabytki.java

package eu.aisen.kamil.miejskiprzewodnik;

import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import java.util.List;

import zabytki.Zabytki;

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

    private List<Zabytek>list_data;
    private Zabytki context;

    public AdapterZabytki(List<Zabytek> list_data, Zabytki context) {
        this.list_data = list_data;
        this.context = context;
    }

    @Override
    public AdapterZabytki.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        CardView view= (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.obiectcard,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Zabytek zabytek = list_data.get(position);

        Picasso.get()
                .load(zabytek
                        .getImage_url())
                .into(holder.img);

        holder.txtname.setText(zabytek.getName());

    }

    @Override
    public int getItemCount() {
        return list_data.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{
        private ImageView img;
        private TextView txtname;
        public ViewHolder(View view) {
            super(view);
            img=(ImageView)itemView.findViewById(R.id.info_image);
            txtname=(TextView)itemView.findViewById(R.id.info_text);
        }
    }
}

Zabytek.java

package eu.aisen.kamil.miejskiprzewodnik;



public class Zabytek {

    private String name;
    private String image_url;
    private String opis;

    public Zabytek(String name, String image_url, String opis) {
        this.name = name;
        this.image_url = image_url;
        this.opis = opis;
    }
    public String getName() {
        return name;
    }
    public String getImage_url() {
        return image_url;
    }
    public String getOpis() {
        return opis;
    }
}

Zabytki.java(片段)

package zabytki;


import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

import eu.aisen.kamil.miejskiprzewodnik.AdapterZabytki;
import eu.aisen.kamil.miejskiprzewodnik.R;
import eu.aisen.kamil.miejskiprzewodnik.Zabytek;

public class Zabytki extends Fragment {

    private static final String HI = "https://wydzialedukacji.rzeszow.pl/testowy.json";
    private ArrayList<Zabytek>list_data;
    private AdapterZabytki mSensorAdapter;
    private RecyclerView mRyclerView;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.zabytki_fragment, container, false);

        mRyclerView = view.findViewById(R.id.main_list);
        mRyclerView.setHasFixedSize(true);
        mRyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));

        list_data = new ArrayList<>();
        getData();

        mSensorAdapter = new AdapterZabytki(list_data, this);
        mRyclerView.setAdapter(mSensorAdapter);
        mSensorAdapter.notifyDataSetChanged();

        return view;
    }

    private void getData() {

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, HI, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        try {
                            JSONArray jsonArray = response.getJSONArray("results");

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

                                String name = object.getString("name");
                                String image_url = object.getString("image_url");
                                String opis = object.getString("opis");

                                list_data.add(new Zabytek(name, image_url, opis));
                            }


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

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        });

        Volley.newRequestQueue(getActivity()).add(request);
    }


}

zabytki_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView android:id="@+id/main_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
</android.support.v7.widget.RecyclerView>

obiectcard.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
        android:layout_height="200dp"
        android:id="@+id/card_view"
        android:layout_margin="5dp"
        card_view:cardCornerRadius="4dp">

    <android.support.constraint.ConstraintLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="16dp">

        <ImageView
            android:id="@+id/info_image"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_marginBottom="24dp"
            android:layout_weight="1.0"
            android:scaleType="centerCrop"
            card_view:layout_constraintBottom_toBottomOf="parent"
            card_view:srcCompat="@android:drawable/sym_def_app_icon"
            tools:ignore="MissingConstraints" />

        <TextView
            android:id="@+id/info_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:layout_marginEnd="16dp"
            android:text="tytułzabytku"
            card_view:layout_constraintEnd_toEndOf="parent"
            card_view:layout_constraintTop_toBottomOf="@+id/info_image" />
    </android.support.constraint.ConstraintLayout>
</android.support.v7.widget.CardView>
java android android-recyclerview android-volley
2个回答
0
投票

我对您的代码有2个顾虑:1.在onResponse中,将所有项目添加到list_data后,必须在RecyclerView适配器(AdapterZabytki)上调用notifyDatasetChanged2.另外,ViewHolder中的info_image高度为零,因为它没有顶部对齐,并且layout_height="0dp"


0
投票

我仍然想知道如何将这些数据传输到ZabytekDetailActivity.class

我有这个:

 mSensorAdapter.setListener(new AdapterZabytki.Listener() {
            public void onClick(int position) {
                ArrayList<Zabytek> object = new ArrayList<Zabytek>();
                Intent intent = new Intent(getActivity(), ZabytekDetailActivity.class);
            }
        });

现在的问题是如何附加list_data的结果,以便可以在MonumentDetailActivity.class中显示它们

© www.soinside.com 2019 - 2024. All rights reserved.