Использование Recyclerview с Volley, не работающим во фрагменте - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь использовать Volley для получения данных через JSON и заполнить данные в RecyclerView фрагментом. Я проверил код с нормальной активностью, и он работает, но мне трудно реализовать эту вещь во фрагменте. Я вижу ответ в формате JSON, когда я вхожу в консоль, но кажется, что никакие данные не добавляются в элемент списка, таким образом, ничего не отображается во фрагменте и нет ошибки в LogCat.

explore_content. xml

Это xml, который будет накачан в адаптере

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

        <ImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:id="@+id/imagesExplore1"
            android:layout_marginRight="10dp"
            android:layout_marginLeft="10dp"
            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/testUrl"
            android:layout_below="@+id/imagesExplore1"
            android:paddingLeft="50dp"
            android:textSize="19sp"
            />

</RelativeLayout>

фрагмент_задачи. xml

Здесь я помещаю RecyclerView

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="fragments.ChallengeFragment">


<androidx.recyclerview.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/testRecyclerView"
    android:paddingBottom="20dp"
    android:paddingStart="10dp"
    android:paddingEnd="10dp"
    android:scrollbars="vertical"
    android:layout_marginTop="20dp"
    />

</RelativeLayout>

ExploreImagesAdapter. java

Используемый мной адаптер

public class ExploreImagesAdapter extends RecyclerView.Adapter<ExploreImagesAdapter.MyViewHolder> {
private Context context;
private List<ExploreImages> exploreImagesList;
RequestOptions options;

public ExploreImagesAdapter(Context context, List<ExploreImages> exploreImagesList) {
    this.context = context;
    this.exploreImagesList = exploreImagesList;
    options = new RequestOptions().centerCrop().placeholder(R.drawable.add_photo).error(R.drawable.back_left_icon);
}

@NonNull
@Override
public ExploreImagesAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.explore_content, parent, false);
    return new ExploreImagesAdapter.MyViewHolder(itemView);
}

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

Glide.with(context).load(exploreImagesLlist.get(position).getImage_url()).apply(options).into(holder.imageView);
holder.testUrl.setText(exploreImagesList.get(position).getImage_url());
}

@Override
public int getItemCount() {
    int a ;

    if(exploreImagesList != null && exploreImagesList.isEmpty()) {

        a = exploreImagesList.size();
    }
    else {

        a = 0;

    }
    return a;
}

public static class MyViewHolder extends RecyclerView.ViewHolder{

    ImageView imageView;
    TextView testUrl;

    public MyViewHolder(@NonNull View itemView) {
        super(itemView);
        imageView = itemView.findViewById(R.id.imagesExplore1);
        testUrl = itemView.findViewById(R.id.testUrl);

    }
}

public void setItems(List<ExploreImages> data) {
    exploreImagesList = data;
    notifyDataSetChanged();

}

public void addData (List<ExploreImages> data) {
    exploreImagesList.addAll(data);
    notifyDataSetChanged();
}
}

ExploreImages. java

Модель для данных

ublic class ExploreImages {

private String image_id;
private String image_url;
private String photo_year;

public ExploreImages(){

}

public ExploreImages(String image_id, String image_url, String photo_year) {
    this.image_id = image_id;
    this.image_url = image_url;
    this.photo_year = photo_year;
}

public String getImage_id() {
    return image_id;
}

public String getImage_url() {
    return image_url;
}

public String getPhoto_year(){
    return  photo_year;
}


public void setImage_id(String image_id) {
    this.image_id = image_id;
}

public void setImage_url(String image_url) {
    this.image_url = image_url;
}

public void setPhoto_year(String photo_year){ this.photo_year = photo_year;}

}

ExploreFragment. java

Наконец фрагмент где Я совершаю сетевой вызов и устанавливаю адаптер

public class ExploreFragment extends Fragment {

private JsonArrayRequest request;
private RequestQueue requestQueue;
private List<ExploreImages> lstAnime;
private ArrayList<ExploreImages> tempList;


public ChallengeFragment() {
    // Required empty public constructor
}

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

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


    lstAnime = new ArrayList<>();

    View root = inflater.inflate(R.layout.fragment_explore, container, false);

    RecyclerView recyclerView = (RecyclerView) root.findViewById(R.id.testRecyclerView);

    ExploreImagesAdapter myAdapter = new ExploreImagesAdapter(getActivity(), lstAnime);


    recyclerView.setAdapter(myAdapter);

    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

   /* myAdapter.notifyDataSetChanged();*/

    jsonrequest();

    // Inflate the layout for this fragment
    return root;
}


private void jsonrequest() {
    request = new JsonArrayRequest(EndPoints.EXPLORE_IMAGES_URL, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {

            /*Log.e("Errorrr", "["+response+"]");*/
            JSONObject jsonObject = null;
            int i;

            for(i=0; i<response.length(); i++){
                try {
                    jsonObject = response.getJSONObject(i);
                    ExploreImages anime = new ExploreImages();
                    anime.setImage_id(jsonObject.getString("id"));
                    anime.setImage_url(jsonObject.getString("url"));
                    anime.setPhoto_year(jsonObject.getString("photo_year"));;
                    Log.e("CHAAAA", "["+response+"]");
                    lstAnime.add(anime);
                    ExploreImagesAdapter myAdapter = new ExploreImagesAdapter(getActivity(), 
lstAnime);
                    myAdapter.setItems(lstAnime);
                }
                catch (JSONException e){
                    e.printStackTrace();
                    Log.e("TESTERROR", "["+response+"]");
                }

                /*ExploreImagesAdapter myAdapter = new ExploreImagesAdapter(getActivity(), lstAnime);

                myAdapter.addData(lstAnime);*/

               setRecyclerView(lstAnime);
            }


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

        }
    });

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


private void setRecyclerView(List<ExploreImages> lstAnime) {
    RecyclerView recyclerViewx = getActivity().findViewById(R.id.testRecyclerView);
    ExploreImagesAdapter myAdapter = new ExploreImagesAdapter(getActivity(), lstAnime);
    recyclerViewx.setAdapter(myAdapter);
    recyclerViewx.setLayoutManager(new LinearLayoutManager(getActivity()));
}
}

Я искал везде и пробовал все, но данные не отображаются, даже когда JSON анализируется в Volley

Ответы [ 4 ]

1 голос
/ 29 марта 2020

Делайте эти вещи

1) Установите менеджер линейного вывода после объявления обзора переработчика

2) Объявите представление переработчика и класс адаптера глобально

3) Обновить адаптер после разбора массива JSON для массива

Например,

public class ExploreFragment extends Fragment {

private JsonArrayRequest request;
private RequestQueue requestQueue;
private List<ExploreImages> lstAnime;
private ArrayList<ExploreImages> tempList;
ExploreImagesAdapter myAdapter;

public ChallengeFragment() {
    // Required empty public constructor
}

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    lstAnime = new ArrayList<>();
    View root = inflater.inflate(R.layout.fragment_explore, container, false);

    RecyclerView recyclerView = (RecyclerView) root.findViewById(R.id.testRecyclerView);
// set layout manager here
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    myAdapter = new ExploreImagesAdapter(getActivity(), lstAnime);
    recyclerView.setAdapter(myAdapter);

    jsonrequest();

    // Inflate the layout for this fragment
    return root;
}


private void jsonrequest() {
    request = new JsonArrayRequest(EndPoints.EXPLORE_IMAGES_URL, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {

            /*Log.e("Errorrr", "["+response+"]");*/
            JSONObject jsonObject = null;
            int i;

            for(i=0; i<response.length(); i++){
                try {
                    jsonObject = response.getJSONObject(i);
                    ExploreImages anime = new ExploreImages();
                    anime.setImage_id(jsonObject.getString("id"));
                    anime.setImage_url(jsonObject.getString("url"));
                    anime.setPhoto_year(jsonObject.getString("photo_year"));;
                    Log.e("CHAAAA", "["+response+"]");
                    lstAnime.add(anime);

                }
                catch (JSONException e){
                    e.printStackTrace();
                    Log.e("TESTERROR", "["+response+"]");
                }


            }
       // update adapter here
                    myAdapter.notifyDataSetChanged();


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

        }
    });

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



}
1 голос
/ 28 марта 2020

Прежде всего, вы всегда создаете новый экземпляр адаптера, и вы не должны этого делать. Оставьте один экземпляр глобальным для этого фрагмента, и вы готовы к go. Затем обновите этот же экземпляр.

Используя свой код:

private ExploreImagesAdapter myAdapter;


  @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {
    lstAnime = new ArrayList<>();
    View root = inflater.inflate(R.layout.fragment_explore, container, false);
    RecyclerView recyclerViewx = getActivity().findViewById(R.id.testRecyclerView);
    myAdapter = new ExploreImagesAdapter(getActivity(), lstAnime);
    recyclerViewx.setAdapter(myAdapter);
    recyclerViewx.setLayoutManager(new LinearLayoutManager(getActivity()));
    jsonrequest();
    return root;
}


private void jsonrequest() {
    request = new JsonArrayRequest(EndPoints.EXPLORE_IMAGES_URL, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {

            /*Log.e("Errorrr", "["+response+"]");*/
            JSONObject jsonObject = null;
            int i;

            for(i=0; i<response.length(); i++){
                try {
                    jsonObject = response.getJSONObject(i);
                    ExploreImages anime = new ExploreImages();
                    anime.setImage_id(jsonObject.getString("id"));
                    anime.setImage_url(jsonObject.getString("url"));
                    anime.setPhoto_year(jsonObject.getString("photo_year"));;
                    Log.e("CHAAAA", "["+response+"]");
                    lstAnime.add(anime);                      
                }
                catch (JSONException e){
                    e.printStackTrace();
                    Log.e("TESTERROR", "["+response+"]");
                }
            }
            myAdapter.setItems(lstAnime);    
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });

    requestQueue = Volley.newRequestQueue(getActivity());
    requestQueue.add(request);
}
1 голос
/ 28 марта 2020

вы делаете несколько вещей неправильно здесь

  1. сделать ExploreImagesAdapter глобальной переменной внутри фрагмента и использовать его повсюду
  2. теперь, когда вы получите свои данные, просто вызовите адаптер и добавить данные в него у вас уже есть функция для этого.
0 голосов
/ 28 марта 2020
RecyclerView recyclerViewx = getActivity().findViewById(R.id.testRecyclerView);

эта строка относится к RecyclerView в вашей активности. Вы должны использовать во фрагменте

...