繁体   English   中英

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

[英]Using Recyclerview with Volley not working in fragment

我正在尝试使用 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>

fragment_challenge.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;}

}

探索片段.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()));
}
}

我到处搜索并尝试了所有方法,但即使在 Volley 中解析了 JSON,也没有显示任何数据

你在这里做错了几件事

  1. 将 ExploreImagesAdapter 作为片段内部的全局变量并在其他地方使用它
  2. 现在,当您获取数据时,只需调用您的适配器并在其中添加数据,您就已经拥有了该功能。

首先,您总是在创建一个新的 Adapter 实例,而您不应该这样做。 为这个 Fragment 保留一个全局实例,你就可以开始了。 然后更新同一个实例。

使用您的代码:

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)声明recyclerview后设置linearlayout manager

2)全局声明recyclerview和adapter类

3) 将 JSON 数组解析为 arraylist 后更新适配器

例如

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

此行指的是您活动中的RecyclerView 你应该在片段中使用

暂无
暂无

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

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