【问题标题】:RecyclerView not showing any item. RecyclerView Adapter with ViewBindingRecyclerView 没有显示任何项目。带有 ViewBinding 的 RecyclerView 适配器
【发布时间】:2023-03-17 22:19:01
【问题描述】:

RecyclerView 没有显示任何项目。

我有以下代码

a) 布局

<?xml version="1.0" encoding="utf-8"?>
<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:orientation="vertical"
    tools:context=".views.ServiceListActivity">

    <include
        android:id="@+id/topMenu"
        layout="@layout/content_top_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="10dp"
        android:text="Service List"
        android:textAlignment="center"
        android:textSize="@dimen/_12sdp"
        android:textStyle="bold"></TextView>


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recylcerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

b) RecyclerView 适配器

public class InstallationListAdapter extends RecyclerView.Adapter<InstallationListAdapter.ServiceViewHolder> {

    private Context mCtx;
    private List<TransactionRecord> transactionRecordList;

    public InstallationListAdapter(Context mCtx, List<TransactionRecord> transactionRecords, String ActivityName) {
        this.mCtx = mCtx;
        this.transactionRecordList = transactionRecords;
    }

    @NonNull
    @Override
    public ServiceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(mCtx);
        return new ServiceViewHolder(ListItemInstallationBinding.inflate(LayoutInflater.from(parent.getContext()),
                parent, false));
    }

    @Override
    public void onBindViewHolder(@NonNull ServiceViewHolder holder, int position) {
        TransactionRecord transactionRecord = transactionRecordList.get(position);

        holder.binding.txtCustomerName.setText(transactionRecord.getCustomer_name());
        holder.binding.txtAddress.setText(transactionRecord.getCustomer_address());
        holder.binding.txtDate.setText(transactionRecord.getService_date());
        holder.binding.txtProducts.setText(transactionRecord.getProduct_name());
        holder.binding.txtTechnicianRemarks.setText(transactionRecord.getTechnician_notes());

        holder.binding.txtCustomerName.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_DIAL);
                intent.setData(Uri.parse("tel:" + transactionRecord.getCustomer_mobile()));
                mCtx.startActivity(intent);
            }
        });
    }

    @Override
    public int getItemCount() {

        return transactionRecordList == null ? 0 :
                transactionRecordList.size();
    }

    public void updateList(List<TransactionRecord> list) {
        transactionRecordList = list;
        notifyDataSetChanged();
    }

    public class ServiceViewHolder extends RecyclerView.ViewHolder{

        ListItemInstallationBinding binding;//Name of the test_list_item.xml in camel case + "Binding"

        public ServiceViewHolder(ListItemInstallationBinding b){
            super(b.getRoot());
            binding = b;
        }
    }
}

c) 活动中

public class ServiceListActivity extends BaseActivity {

    ActivityServiceListBinding binding;

    List<TransactionRecord> transactionRecordList;
    RecyclerView recyclerView;
    EditText txtFilter;
    InstallationListAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityServiceListBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);

        binding.topMenu.btnBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        new getServiceData().execute();
    }

    private class getServiceData extends AsyncTask<Void, Void, ReturnClass<List<TransactionRecord>>> {

        @Override
        public void onPreExecute() {
            ProgressDialogHandler.getInstance().showCustomProgressDialog(activity);
        }

        @Override
        public ReturnClass<List<TransactionRecord>> doInBackground(Void... voidArr) {
            ReturnClass<List<TransactionRecord>> returnClass = new ReturnClass<>();
            try {
                returnClass = APIProcessor.getInstallationData();
            } catch (Exception e) {
                e.printStackTrace();
                returnClass.setStatus(false);
                returnClass.setMessage(e.getMessage());
            }
            return returnClass;
        }

        @Override
        public void onPostExecute(ReturnClass<List<TransactionRecord>> returnClass) {
            if (!returnClass.getStatus().booleanValue()) {
                ProgressDialogHandler.getInstance().dismissCustomProgressDialog(activity);
                if (returnClass.getMessage().equals("Return response code is not 200")) {
                    activity.runOnUiThread(new Runnable() {
                        public void run() {
//some code
                        }
                    });
                } else {
                    CommonUtils.showAlertDialog(activity, "Error", returnClass.getMessage());
                }
                return;
            }
            activity.runOnUiThread(new Runnable() {
                public void run() {
                    transactionRecordList = returnClass.getValue();
                    adapter = new InstallationListAdapter(activity, transactionRecordList, "completed");
                    binding.recylcerView.setAdapter(adapter);                    ProgressDialogHandler.getInstance().dismissCustomProgressDialog(activity);
                }
            });
        }
    }
}

【问题讨论】:

  • transactionRecordList 不为空?
  • 不。超过 50 条记录。
  • wired,您的代码似乎没有问题,您能否发布 ListItemInstallationBinding 和活动代码的代码?
  • 你在哪里调用 updateList?也许我只是想念它,但我看不到它
  • @Chris:当我使用过滤器文本框时会调用更新列表。但在这种情况下,初始列表没有被加载。

标签: android android-recyclerview android-viewbinding


【解决方案1】:

您应该将layout manager 设置为RecyclerView

xml布局中的第一种方式:

<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recylcerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

或在 Java 代码中:

recyclerView.setLayoutManager(new LinearLayoutManager(context));

【讨论】:

    【解决方案2】:

    onPostExecute 方法中不需要 runonUiThread 方法。

    而且你没有在recyclerview中设置layoutmanager。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 2017-01-09
      • 2022-01-18
      • 2016-01-29
      • 2017-02-24
      • 1970-01-01
      相关资源
      最近更新 更多