【问题标题】:Facing error in onBindView() method in recyclerViewrecyclerView 中的 onBindView() 方法面临错误
【发布时间】:2022-02-05 11:14:47
【问题描述】:

我只是在练习 RecyclerView。当我运行应用程序时,我的应用程序崩溃了,我检查了日志,但我无法理解问题可以帮助我等待有人回复吗?

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

    private model[] localDataSet;
    private TextView name,number;
    public static class ViewHolder extends RecyclerView.ViewHolder {
        private final TextView textView;

        public ViewHolder(View view) {
            super(view);
            textView = (TextView) view.findViewById(R.id.name);
        }

        public TextView getTextView() {
            return textView;
        }
    }
    public CustomAdapter(model[] dataSet) {
        localDataSet = dataSet;
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        // Create a new view, which defines the UI of the list item
        View view = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.contacx, viewGroup, false);
        view.findViewById(R.id.name);
        view.findViewById(R.id.number);
        return new ViewHolder(view);
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, final int position) {


        name.setText(localDataSet[position].getName());
        number.setText(localDataSet[position].getPhone());
    }
    @Override
    public int getItemCount() {
        return localDataSet.length;
    }
}

【问题讨论】:

  • 您的namenumber 字段未正确初始化。你能发布你的完整适配器的代码吗?
  • 我认为你应该使用 holder.name.setText(localDataSet[position].getName());并且,holder.number.setText(String.valueOf(localDataSet[position].getPhone()));
  • @LucaPizzini 请检查一下
  • @RudraRokaya 它不工作
  • 能否请您发布您的模型/实体类。

标签: java android android-studio android-layout


【解决方案1】:

您需要在代码中更改以下内容:

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

private model[] localDataSet;
//remove this from here.
//private TextView name,number;
public static class ViewHolder extends RecyclerView.ViewHolder {
    //This should be from the layout you have passed in ViewHolder method. in your case from R.layout.contacx. This layout should have two textview with ids:- name and phone respectively.
    private final TextView name, phone;

    public ViewHolder(View view) {
        super(view);
        name = view.findViewById(R.id.name);
        phone = view.findViewById(R.id.phone);
    }
}
public CustomAdapter(model[] dataSet) {
    localDataSet = dataSet;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    // Create a new view, which defines the UI of the list item
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.contacx, viewGroup, false);
    //remvoe this from here.
    //view.findViewById(R.id.name);
    //view.findViewById(R.id.number);
    return new ViewHolder(view);
}

// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder viewHolder, final int position) {

   //here you should call those view to bind your data like:
    viewHolder.name.setText(localDataSet[position].getName());
    viewHolder.phone.setText(String.valueOf(localDataSet[position].getPhone()));
}
@Override
public int getItemCount() {
    return localDataSet.length;
 }
}

【讨论】:

    【解决方案2】:

    使用 ViewHolder 进行数据绑定。更安全

    public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
        private model[] localDataSet;
    
        public static class ViewHolder extends RecyclerView.ViewHolder {
            private final TextView name, number;
            public ViewHolder(View view) {
                super(view);
                name = view.findViewById(R.id.name);
                number = view.findViewById(R.id.phone);
            }
    
            public void bindData(model data) {
                name.setText(data.getName());
                number.setText(String.valueOf(data.getPhone()));
            }
        }
    
        public CustomAdapter(model[] dataSet) {
            localDataSet = dataSet;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
            /* No Need
              View view = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.contacx, viewGroup, false);
              view.findViewById(R.id.name);
              view.findViewById(R.id.number);
             */
            return new ViewHolder(LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.contacx, viewGroup, false););
        }
    
        @Override
        public void onBindViewHolder(ViewHolder viewHolder, final int position) {
            /*
            name.setText(localDataSet[position].getName());
            number.setText(localDataSet[position].getPhone());
             */
            viewHolder.bindData(localDataSet[position]);
        }
    
        @Override
        public int getItemCount() {
            return localDataSet.length;
        }
    
       
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 1970-01-01
      • 2021-03-24
      • 2022-06-20
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 2020-11-15
      • 1970-01-01
      相关资源
      最近更新 更多