Volley不在RecyclerView中显示数据 [英] Volley is not showing the data in the RecyclerView

查看:66
本文介绍了Volley不在RecyclerView中显示数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用volley方法从JSON文件中获取数据,并在RecyclerView中显示它,但在RecyclerView上未显示任何数据.在xampp上配置了mysql Databse.代码如下. 我是android新手,所以您必须详细给出答案.

I am trying to get data from a JSON File using volley method and show it in RecyclerView but its not showing any data on RecyclerView. mysql Databse is configured on xampp. Code is below. I am new to android so you have to give your answers in detail.

这是我的PHP文件getdata.php:

Here is my PHP file getdata.php:

$connect = mysqli_connect("127.0.0.1", "root" , "", "recycleview_volley");


$query = "SELECT * FROM image_data";
$result = mysqli_query($connect,$query);
$recycler_data = array();
while($row = mysqli_fetch_array($result))
{
    $recycler_data [] = array(
   'image_url'     => $row["image_url"],
   'image_name'    => $row["image_name"]


    );

}
echo json_encode($recycler_data);

我的MainActivity.java:

my MainActivity.java:

package com.example.razaz.recyclerviewpractice;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;

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

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

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";

private RequestQueue mQueue;

private ArrayList<String> mNames = new ArrayList<>();
private ArrayList<String> mImageUrls = new ArrayList<>();
public String url = "";




@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Log.d(TAG, "onCreate: started.");


    mQueue = Volley.newRequestQueue(this);




    getData();
    initRecyclerView();



}



    private void initRecyclerView(){
        Log.d(TAG, "initRecyclerView: init recyclerView.");


        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, mNames, mImageUrls);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
    }

    public void getData(){
        url = "http://127.0.0.1/recycler_api/getdata.php";


        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url,null,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        try {

                            for (int i = 0; i < response.length(); i++) {
                                JSONObject jsonObject = response.getJSONObject(i);
                                mImageUrls.add(jsonObject.getString("image_url"));
                                mNames.add(jsonObject.getString("image_name"));



                            }


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

                    }

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

                error.getStackTrace();

            }


        });



        mQueue.add(jsonArrayRequest);
    }

}

我的RecyclerViewAdapter.java

my RecyclerViewAdapter.java

package com.example.razaz.recyclerviewpractice;

import android.content.Context;

import android.support.v7.widget.RecyclerView;
import android.text.Layout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;

import java.util.ArrayList;

import de.hdodenhof.circleimageview.CircleImageView;

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{
    private static final String TAG = "RecyclerViewAdapter";

    ArrayList<String> mImagesNames = new ArrayList<>();
    ArrayList<String> mImages = new ArrayList<>();
    private Context mContext;

    public RecyclerViewAdapter(Context mContext, ArrayList<String> mImagesNames, ArrayList<String> mImages) {
        this.mImagesNames = mImagesNames;
        this.mImages = mImages;
        this.mContext = mContext;
    }


    @Override
    public ViewHolder onCreateViewHolder( ViewGroup viewGroup, int i) {

        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_listitem, viewGroup, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder( ViewHolder viewHolder, final int position) {
        Log.d(TAG, "onBindViewHolder: called.");

        Glide.with(mContext)
                .asBitmap()
                .load(mImages.get(position))
                .into(viewHolder.image) ;

        viewHolder.imageName.setText(mImagesNames.get(position));
        viewHolder.parentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: Clicked on: "+ mImages.get(position));

                Toast.makeText(mContext, mImagesNames.get(position), Toast.LENGTH_SHORT).show();
            }
        });

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{

        CircleImageView image;
        TextView imageName;
        RelativeLayout parentLayout;

        public ViewHolder(View itemView) {
            super(itemView);
            image = itemView.findViewById(R.id.image);
            imageName = itemView.findViewById(R.id.image_name);
            parentLayout = itemView.findViewById(R.id.parent_layout);
        }
    }
}

我认为排球存在错误.

推荐答案

在Adapter类中编写:

In Adapter class write:

private ArrayList<String> mImageList;
public void setDataChange(ArrayList<String> imageList) {
    mImageList = new ArrayList<>(imageList);
    notifyDataSetChanged();
}

onResponse()内部的Volley响应方法获得成功结果后,调用此方法. 根据您的List<String>解析结果,创建一个列表并将其添加到全局列表中并调用:

Call this method after getting successful result on Volley response method that is inside onResponse(). Parse the result as per your List<String>, Create a list and add it into your global list and call:

adapter.setDataChange(imageList);

或者另一种方式:

  1. 创建imageUrl和imageName的pojo;

  1. Create pojo of imageUrl and imageName;

private List<PojoClass> imageList;

在onResponse()中获得结果后, 这样做:

After getting result in onResponse(), do like this:

imageList =new List<PojoClass>;

PojoClass pojo=new PojoClass();
pojo.setImageUrl(imageUrl);
pojo.setImageName(imageName);

imageList.add(pojo);

像这样通过适配器传递它:

pass it over adapter like this:

adapter.setDataChange(imageList);

这篇关于Volley不在RecyclerView中显示数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆