Android-залп ресайклера не показывает данные

Я потратил много времени на отладку этого кода, но, к сожалению, не смог найти ошибку, может кто-нибудь помочь мне найти проблему в этом коде. Я не могу видеть данные на странице активности. Хотя я обнаружил, что получаю ответные данные с сервера.

Класс деятельности

public class SelectServiceActivity extends AppCompatActivity {

    private TextView textView;
    private RecyclerView recyclerView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select_service);

        recyclerView = (RecyclerView) findViewById(R.id.select_service_rv);

        String serviceTypeId = getIntent().getStringExtra(AppConstants.SELECTED_SERVICE_TYPE_ID);

        getProductDetailsByProductId(serviceTypeId);
    }

    private void getProductDetailsByProductId(String serviceTypeId) {

        final List<SelectServiceBean> selectServiceList = new ArrayList<>();
        final JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(
                Request.Method.GET,
                APIEndpoints.SERVICE_LIST_URI + serviceTypeId,
                null,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        if (response.length() > 0) {
                            for (int i = 0; i < response.length(); i++) {
                                try {
                                    selectServiceList.add(DatabaseObjectsMapper.selectServiceBeanMapper((JSONObject) response.get(i)));
                                } catch (JSONException e) {
                                    Toast.makeText(SelectServiceActivity.this, "Something went wrong : " + e.getMessage(), Toast.LENGTH_LONG).show();
                                }
                            }
                            recyclerView.setAdapter(new SelectServiceAdapter(getApplicationContext(),selectServiceList));
                        } else {
                            Toast.makeText(SelectServiceActivity.this, "No Response From Server!", Toast.LENGTH_LONG).show();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(SelectServiceActivity.this, error.toString(), Toast.LENGTH_LONG).show();
                    }
                });

        VolleySingleton.getInstance(SelectServiceActivity.this).addToRequestQueue(jsonArrayRequest);
    }
}

Класс адаптера

public class SelectServiceAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context context;
    private List<SelectServiceBean> selectServiceList;

    public SelectServiceAdapter(final Context context, final List<SelectServiceBean> selectServiceList) {
        this.context = context;
        this.selectServiceList = selectServiceList;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View row = LayoutInflater.from(context).inflate(R.layout.item_select_service, parent, false);
        return (new Item(row));
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ((Item) holder).serviceTypeIssue.setText(selectServiceList.get(position).getServiceTypeIssue());
        ((Item) holder).serviceTypeIssue.setText(selectServiceList.get(position).getServiceType());
    }

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

    public static class Item extends RecyclerView.ViewHolder {

        private TextView serviceTypeIssue;
        private TextView serviceType;

        public Item(View view) {
            super(view);
            serviceTypeIssue = view.findViewById(R.id.service_type_issue);

        }

    }
}

Один элемент просмотра

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <android.support.v7.widget.AppCompatTextView
            android:id="@+id/service_type_issue"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:text="Sample text" />


        <android.support.v7.widget.AppCompatCheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true" />

    </RelativeLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="1sp"
        android:background="@color/lightGrey" />

</LinearLayout>

Recyclerview File

<LinearLayout 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/select_service_rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

1 ответ

От docs

Для работы RecyclerView должен быть предоставлен LayoutManager.

Вам нужно добавить layoutManager

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

        recyclerView = (RecyclerView) findViewById(R.id.select_service_rv);
        LinearLayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
        //^^^^^^^^^^^
        recyclerView.setLayoutManager(mLayoutManager);    
        //^^^^^^^^^^^^^^^^^^^^
        String serviceTypeId = getIntent().getStringExtra(AppConstants.SELECTED_SERVICE_TYPE_ID);

        getProductDetailsByProductId(serviceTypeId);
    }

Улучшение:

  • инициализировать serviceType в Item класс и использовать его в onBindViewHolder

    public Item(View view) {
        super(view);
        serviceTypeIssue = view.findViewById(R.id.service_type_issue);
        serviceType      = view.findViewById(R.id.yourID);
        //^^^^^^^
    }
    
  • Сохранить ссылку на new SelectServiceAdapter так что позже вы можете использовать notify функции для более оптимальной производительности

    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
      ((Item)holder).serviceTypeIssue.setText(selectServiceList.get(position).getServiceTypeIssue());
      ((Item)holder).serviceType.setText(String.valueOf(selectServiceList.get(position).getServiceType()));
      //^^^^^^^^
    
    }
    
Другие вопросы по тегам