Volley 没有在 RecyclerView 中显示数据
Volley is not showing the data in the RecyclerView
我正在尝试使用 volley 方法从 JSON 文件中获取数据并将其显示在 RecyclerView 中,但它没有在 RecyclerView 中显示任何数据。 mysql 数据库在 xampp 上配置。代码如下。
我是新手 android 所以你必须详细给出你的答案。
这是我的 PHP 文件 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:
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
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);
}
}
}
我认为 volley 有一个错误。
在适配器class中写入:
private ArrayList<String> mImageList;
public void setDataChange(ArrayList<String> imageList) {
mImageList = new ArrayList<>(imageList);
notifyDataSetChanged();
}
在 onResponse()
内的 Volley 响应方法获得成功结果后调用此方法。
根据您的 List<String>
解析结果,创建一个列表并将其添加到您的全局列表中并调用:
adapter.setDataChange(imageList);
或另一种方式:
创建 imageUrl 和 imageName 的 pojo;
private List<PojoClass> imageList;
在 onResponse() 中得到结果后,
这样做:
imageList =new List<PojoClass>;
PojoClass pojo=new PojoClass();
pojo.setImageUrl(imageUrl);
pojo.setImageName(imageName);
imageList.add(pojo);
像这样通过适配器传递它:
adapter.setDataChange(imageList);
在监听器中:
将接口或监听器设为:
public interface OnRowItemClick {
void onClick(int position, PojoClass pojo);
}
在适配器中 class:
声明点击侦听器对象:
private OnRowItemClick mOnRowItemClick;
private List<PojoClass> imageList;
获取适配器构造函数中的对象:
public HomeCategoriesAdapter(Context mContext, OnRowItemClick mOnRowItemClick,
ArrayList<PojoClass> imageArrayList) {
this.mContext = mContext;
this.mOnItemClickListener = mOnItemClickListener;
this.imageList = imageArrayList;
}
在 bindView 方法中,您设置详细信息的位置:
PojoClass pojo = imageList.get(position);
viewHolder.parentLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickListener.onClick(position, pojo);
}
});
在 MainActivity 中:
声明你的适配器class:
private List<PojoClass> imageList;
private MyItemAdapter myItemAdapter;
初始化你的适配器class:
List<YourModel> modelItemList;
modelItemList = new ArrayList<>();
myItemAdapter = new MyItemAdapter(mContext, this, modelItemList);
recyclerView.setAdapter(myItemAdapter);
售后服务电话:
imageList =new List<PojoClass>;
PojoClass pojo=new PojoClass();
pojo.setImageUrl(imageUrl);
pojo.setImageName(imageName);
imageList.add(pojo);
adapter.setDataChange(imageList);
我正在尝试使用 volley 方法从 JSON 文件中获取数据并将其显示在 RecyclerView 中,但它没有在 RecyclerView 中显示任何数据。 mysql 数据库在 xampp 上配置。代码如下。 我是新手 android 所以你必须详细给出你的答案。
这是我的 PHP 文件 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:
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
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);
}
}
}
我认为 volley 有一个错误。
在适配器class中写入:
private ArrayList<String> mImageList;
public void setDataChange(ArrayList<String> imageList) {
mImageList = new ArrayList<>(imageList);
notifyDataSetChanged();
}
在 onResponse()
内的 Volley 响应方法获得成功结果后调用此方法。
根据您的 List<String>
解析结果,创建一个列表并将其添加到您的全局列表中并调用:
adapter.setDataChange(imageList);
或另一种方式:
创建 imageUrl 和 imageName 的 pojo;
private List<PojoClass> imageList;
在 onResponse() 中得到结果后, 这样做:
imageList =new List<PojoClass>;
PojoClass pojo=new PojoClass();
pojo.setImageUrl(imageUrl);
pojo.setImageName(imageName);
imageList.add(pojo);
像这样通过适配器传递它:
adapter.setDataChange(imageList);
在监听器中: 将接口或监听器设为:
public interface OnRowItemClick {
void onClick(int position, PojoClass pojo);
}
在适配器中 class:
声明点击侦听器对象:
private OnRowItemClick mOnRowItemClick; private List<PojoClass> imageList;
获取适配器构造函数中的对象:
public HomeCategoriesAdapter(Context mContext, OnRowItemClick mOnRowItemClick, ArrayList<PojoClass> imageArrayList) { this.mContext = mContext; this.mOnItemClickListener = mOnItemClickListener; this.imageList = imageArrayList;
}
在 bindView 方法中,您设置详细信息的位置:
PojoClass pojo = imageList.get(position); viewHolder.parentLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onClick(position, pojo); } });
在 MainActivity 中:
声明你的适配器class:
private List<PojoClass> imageList; private MyItemAdapter myItemAdapter;
初始化你的适配器class:
List<YourModel> modelItemList; modelItemList = new ArrayList<>(); myItemAdapter = new MyItemAdapter(mContext, this, modelItemList); recyclerView.setAdapter(myItemAdapter);
售后服务电话:
imageList =new List<PojoClass>;
PojoClass pojo=new PojoClass();
pojo.setImageUrl(imageUrl);
pojo.setImageName(imageName);
imageList.add(pojo);
adapter.setDataChange(imageList);