【问题标题】:Android - Blank RecyclerViewAndroid - 空白 RecyclerView
【发布时间】: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,0

7f0b006b 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


【解决方案1】:

我认为您的 smallPictureUrl 仍然包含 null。这就是为什么您的 RecyclerView 没有显示的原因,因为 listServices 到目前为止是空的。

您正在解析海报对吗??来自烂番茄 api??。海报也是一个 Json 对象,其中包含三个海报 url。在这之间你必须解析缩略图对吗??

所以这里你要写

`JSONObject objPoster =   serviceObject.getJSONObject("posters");
 String smallPictureUrl = null;
            if (serviceObject.has(KEY_IMAGE_THUMBNAIL)) {
                smallPictureUrl = serviceObject.getString(KEY_IMAGE_THUMBNAIL);
            }

希望对你有帮助..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多