简体   繁体   English

将 Recyclerview 与 Volley 一起使用在片段中不起作用

[英]Using Recyclerview with Volley not working in fragment

I am trying to use Volley to get data via JSON and populate the data in RecyclerView in fragment.我正在尝试使用 Volley 通过 JSON 获取数据并在片段中填充 RecyclerView 中的数据。 I have tested the code with normal activity and it works, but I am finding it difficult implementing thesame thing in fragment.我已经用正常活动测试了代码并且它可以工作,但是我发现很难在片段中实现相同的东西。 I can see the response in JSON format when I Log in console but it seems no data is added to the list item, thus nothing is displayed in fragment and no error in LogCat.当我登录控制台时,我可以看到 JSON 格式的响应,但似乎没有数据添加到列表项中,因此片段中没有显示任何内容,LogCat 中也没有错误。

explore_content.xml explore_content.xml

This is the xml that'l be inflated in the adapter这是将在适配器中膨胀的 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>

fragment_challenge.xml fragment_challenge.xml

This is where I put the RecyclerView这是我放置 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 ExploreImagesAdapter.java

The adapter I use我使用的适配器

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 ExploreImages.java

A model for the data数据模型

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探索片段.java

Finally the fragment where I make the network call and set the Adapter最后是我进行网络调用并设置适配器的片段

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()));
}
}

I have searched Everywhere and tried everything but no data is displayed even when the JSON is parsed in Volley我到处搜索并尝试了所有方法,但即使在 Volley 中解析了 JSON,也没有显示任何数据

you are doing several things wrong here你在这里做错了几件事

  1. make ExploreImagesAdapter as global variable inside of fragment and use it everywhere else将 ExploreImagesAdapter 作为片段内部的全局变量并在其他地方使用它
  2. now when you will get your data just call your adapter and add Data in it you already have function for that.现在,当您获取数据时,只需调用您的适配器并在其中添加数据,您就已经拥有了该功能。

First of all you're always creating a new Adapter instance and you shouldn't.首先,您总是在创建一个新的 Adapter 实例,而您不应该这样做。 Keep one instance global to this Fragment and you're good to go.为这个 Fragment 保留一个全局实例,你就可以开始了。 Then update that same instance.然后更新同一个实例。

Using your code:使用您的代码:

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);
}

Do these things做这些事

1) Set linearlayout manager after declaring recyclerview 1)声明recyclerview后设置linearlayout manager

2) Declare recyclerview and adapter class globally 2)全局声明recyclerview和adapter类

3) Update adapter after parsing JSON array to arraylist 3) 将 JSON 数组解析为 arraylist 后更新适配器

Eg例如

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);
}



}
RecyclerView recyclerViewx = getActivity().findViewById(R.id.testRecyclerView);

this line refers to the RecyclerView in your activity.此行指的是您活动中的RecyclerView You should use in the fragment你应该在片段中使用

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM