【发布时间】:2015-05-28 16:20:37
【问题描述】:
我能够从 URL 获取 JSON 响应,然后当我在 RecyclerView 上显示相同的响应时,我得到一个空白输出,但选项卡和导航抽屉存在。运行应用程序时也没有错误。我也在使用 Volley 库。
问题:我在列出服务的 RecylerView 上没有得到任何输出。我将在此处发布与 RecyclerView 相关的代码。我还在底部发布了堆栈跟踪。
ServiceViewAdapter.java (适配器)
public class ServiceViewAdapter extends RecyclerView.Adapter<ServiceViewAdapter.ViewHolderService> {
private LayoutInflater mLayoutInflater;
private ArrayList<Service> listServices = new ArrayList<>();
private VolleySingleton mVolleySingleton;
private ImageLoader mImageLoader;
public ServiceViewAdapter(Context context) {
mLayoutInflater = LayoutInflater.from(context);
mVolleySingleton = VolleySingleton.getInstance();
mImageLoader = mVolleySingleton.getImageLoader();
}
public void setServiceList(ArrayList<Service> listServices){
this.listServices = listServices;
notifyItemRangeChanged(0, listServices.size());
}
static class ViewHolderService extends RecyclerView.ViewHolder {
private ImageView imageViewService;
private TextView textViewName;
private TextView textViewOrgName;
private TextView textViewPrice;
private RatingBar ratingBarScoreRating;
public ViewHolderService(View itemView) {
super(itemView);
imageViewService = (ImageView) itemView.findViewById(R.id.image_view_list);
textViewName = (TextView) itemView.findViewById(R.id.textViewName);
textViewOrgName = (TextView) itemView.findViewById(R.id.textViewOrgName);
textViewPrice = (TextView) itemView.findViewById(R.id.textViewPrice);
ratingBarScoreRating = (RatingBar) itemView.findViewById(R.id.ratingBarScoreRating);
}
}
@Override
public ViewHolderService onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mLayoutInflater.inflate(R.layout.custom_services_all, parent, false);
ViewHolderService viewHolderService = new ViewHolderService(view);
return viewHolderService;
}
@Override
public void onBindViewHolder(final ViewHolderService holder, int position) {
Service currentService = listServices.get(position);
holder.textViewName.setText(currentService.getName());
holder.textViewOrgName.setText(currentService.getOrgName());
holder.textViewPrice.setText(String.valueOf(currentService.getPrice()));
holder.ratingBarScoreRating.setNumStars(4);
String imageUrl = currentService.getImageUrl();
if(imageUrl!=null){
mImageLoader.get(imageUrl, new ImageLoader.ImageListener() {
@Override
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
holder.imageViewService.setImageBitmap(response.getBitmap());
}
@Override
public void onErrorResponse(VolleyError error) {
}
});
}
}
@Override
public int getItemCount() {
return listServices.size();
}
}
FragmentAll.java(显示 RecyclerView 的片段)
public class FragmentAll extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private VolleySingleton mVolleySingleton;
private ImageLoader mImageLoader;
private RequestQueue mRequestQueue;
private ArrayList<Service> listServices = new ArrayList<>();
private ServiceViewAdapter mServiceViewAdapter;
private RecyclerView recyclerViewServices;
// TODO: Rename and change types and number of parameters
public static FragmentAll newInstance(String param1, String param2) {
FragmentAll fragment = new FragmentAll();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
public static String getRequestUrl() {
return URL_SEARCH_BASE
+ URL_CHAR_QUESTION
+ URL_PARM_SEARCH
+ URL_CHAR_AMPERSAND
+ URL_PARM_PAGENO + MyApplication.HOME_PAGE_NUMBER;
}
public FragmentAll() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
mVolleySingleton = VolleySingleton.getInstance();
mRequestQueue = mVolleySingleton.getRequestQueue();
sendJsonRequest();
}
public void sendJsonRequest() {
JsonArrayRequest request = new JsonArrayRequest
(
getRequestUrl(),
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
listServices = parseJSONResponse(response);
mServiceViewAdapter.setServiceList(listServices);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
mRequestQueue.add(request);
}
private ArrayList<Service> parseJSONResponse(JSONArray response) {
ArrayList<Service> listServices = new ArrayList<>();
if (response != null && response.length() > 0) {
try {
for (int i = 0; i < response.length(); i++) {
JSONObject serviceObject = response.getJSONObject(i);
long id = serviceObject.getLong(KEY_ID);
String name = serviceObject.getString(KEY_NAME);
long price = serviceObject.getLong(KEY_PRICE);
String smallPictureUrl = null;
if (serviceObject.has(KEY_IMAGE_THUMBNAIL)) {
smallPictureUrl = serviceObject.getString(KEY_IMAGE_THUMBNAIL);
}
JSONObject postedUserObject = serviceObject.getJSONObject(KEY_POSTED_USER);
JSONObject profileObject = postedUserObject.getJSONObject(KEY_PROFILE);
String orgName = profileObject.getString(KEY_ORG_NAME);
int rating = profileObject.getInt(KEY_RATING);
Service service = new Service();
service.setId(id);
service.setName(name);
service.setPrice(price);
service.setOrgName(orgName);
service.setRating(rating);
service.setImageUrl(smallPictureUrl);
listServices.add(service);
}
} catch (Exception e) {
}
}
return listServices;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_all, container, false);
recyclerViewServices = (RecyclerView) view.findViewById(R.id.listAllServices);
recyclerViewServices.setLayoutManager(new LinearLayoutManager(getActivity()));
mServiceViewAdapter = new ServiceViewAdapter(getActivity());
recyclerViewServices.setAdapter(mServiceViewAdapter);
sendJsonRequest();
return view;
}
}
fragment_all.xml(主要片段布局)
<FrameLayout 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"
<android.support.v7.widget.RecyclerView
android:id="@+id/listAllServices"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
custom_services_all.xml(片段中的单个项目)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="54dp"
android:layout_height="80dp"
android:id="@+id/imageView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/textViewName"
android:layout_toRightOf="@+id/imageView"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/textViewOrgName"
android:layout_below="@+id/textViewName"
android:layout_toRightOf="@+id/imageView"
/>
<RatingBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ratingBarScoreRating"
android:layout_below="@+id/textViewOrgName"
android:layout_toRightOf="@+id/imageView"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/textViewPrice"
android:layout_below="@+id/textViewName"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"/>
</RelativeLayout>
StackTrace(日志输出)
05-28 12:28:06.057 1644-1644/com.piserve.geejo.mskv4 I/art: 后期启用 -Xcheck:jni 05-28 12:28:06.183
1644-1654/com.piserve.geejo.mskv4 I/art:调试器不再活动 05-28 12:28:06.270 1644-1644/com.piserve.geejo.mskv4 I/ViewUtils﹕ app:theme 现已弃用。请转为使用 android:theme 反而。 05-28 12:28:06.463 1644-1664/com.piserve.geejo.mskv4 D/OpenGLRenderer:渲染脏区域请求:真 05-28 12:28:06.476 1644-1644/com.piserve.geejo.mskv4 D/﹕ HostConnection::get() 新主机连接建立 0xabb86940, tid 1644 05-28 12:28:06.514 1644-1644/com.piserve.geejo.mskv4 D/Atlas: 正在验证地图... 05-28 12:28:06.682
1644-1664/com.piserve.geejo.mskv4 D/libEGL:已加载 /system/lib/egl/libEGL_emulation.so 05-28 12:28:06.683
1644-1664/com.piserve.geejo.mskv4 D/libEGL:已加载 /system/lib/egl/libGLESv1_CM_emulation.so 05-28 12:28:06.724
1644-1664/com.piserve.geejo.mskv4 D/libEGL:已加载 /system/lib/egl/libGLESv2_emulation.so 05-28 12:28:06.767
1644-1664/com.piserve.geejo.mskv4 D/: HostConnection::get() 新主机 连接建立 0xa3305120, tid 1664 05-28 12:28:06.815
1644-1664/com.piserve.geejo.mskv4 I/OpenGLRenderer:初始化的 EGL, 1.4 版 05-28 12:28:06.996 1644-1664/com.piserve.geejo.mskv4 D/OpenGLRenderer:启用调试模式 0 05-28 12:28:07.091
1644-1664/com.piserve.geejo.mskv4 W/EGL_emulation:eglSurfaceAttrib 未实施 05-28 12:28:07.091
1644-1664/com.piserve.geejo.mskv4 W/OpenGLRenderer:无法设置 表面 0xa3307440 上的 EGL_SWAP_BEHAVIOR,错误 = EGL_SUCCESS 05-28 12:28:07.219 1644-1644/com.piserve.geejo.mskv4 W/View: android.widget.ImageView{31787f8 不正确地调用 requestLayout() V.ED.... ......ID 0,0-0,0 #7f0b006b app:id/selector} 在布局期间: 运行第二次布局传递 05-28 12:28:07.219
1644-1644/com.piserve.geejo.mskv4 W/View: requestLayout() 不正确 由 android.widget.ImageView{1e42a4d1 V.ED.... ......I. 调用0,0-0,07f0b006b app:id/selector} 在布局期间:运行第二个布局传递 05-28 12:28:07.219 1644-1644/com.piserve.geejo.mskv4 W/View:
requestLayout() 被 android.widget.ImageView{3b3e0b36 错误调用 V.ED....... ......我。 0,0-0,0 #7f0b006b app:id/selector} 在布局期间: 运行第二次布局传递 05-28 12:28:07.243
1644-1644/com.piserve.geejo.mskv4 I/Choreographer:跳过30帧! 应用程序可能在其主线程上做了太多工作。 05-28 12:28:07.997 1644-1644/com.piserve.geejo.mskv4 I/Choreographer﹕ 跳过了 44 帧!应用程序可能在其上做太多工作 主线程。 05-28 12:28:11.577 1644-1668/com.piserve.geejo.mskv4 D/Volley:[165] BasicNetwork.logSlowRequests:HTTP 响应 请求=http://myservicekart.com/public/search?search=&pageno=1 0x7b216334 正常 1> [寿命=4932],[大小=262811],[rc=200], [retryCount=0] 05-28 12:28:11.597 1644-1644/com.piserve.geejo.mskv4 D/Volley:[1] Request.finish: 4962 ms: [] http://myservicekart.com/public/search?search=&pageno=10x7b216334 正常 1
【问题讨论】:
-
你有什么问题?
-
RecyclerView 运行时的输出为空白。
-
你能帮我吗?
标签: android android-volley android-adapter android-recyclerview