【问题标题】:Items is not able to set in recycler view项目无法在回收站视图中设置
【发布时间】:2020-10-11 13:34:11
【问题描述】:

适配器代码

 public class ButtonGroupAdp extends RecyclerView.Adapter<ButtonGroupAdp.MyViewHolder> {


    List<ButtonGroup> mList;

    private ItemClickListener mClickListener;
    Context context;
    private int screenWidth;

    public ButtonGroupAdp(List<ButtonGroup> mList, Context context) {
        this.mList = mList;
        this.context = context;
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        screenWidth = size.x;
    }


    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView txtTitle;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            txtTitle = itemView.findViewById(R.id.tv_name);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(context);
        View view = layoutInflater.inflate(R.layout.list_groupname, parent, false);

        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

        ButtonGroup datum = mList.get(position);
        holder.txtTitle.setText("" + datum.getGroupName());
        datum.notifyAll();


    }

    public interface ItemClickListener {
        void onItemClick(View view, int position);
    }


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

这是我的主要活动代码

badp = new ButtonGroupAdp(mlist, this);

    mlist = new ArrayList<>();
    mlist =  mobexInAppDb.getAllProductList(site);
   myRecyclerView.setAdapter(badp);

这是 m 从 sqlite 获取值的地方

 public List<ButtonGroup> getAllProductList(String siteCode) {
    List<ButtonGroup> buttonGroups = new ArrayList<>();
    Cursor cursor = null;
    SQLiteDatabase db = this.getWritableDatabase();
    cursor = db.rawQuery("SELECT DISTINCT groupName,groupId FROM ButtonGroups where parentGroupId='"+null+"' and siteCode='"+siteCode+"'", null);
    if (cursor.getCount() != 0) {
        while (cursor.moveToNext()) {
            ButtonGroup buttonGroup = new ButtonGroup(cursor.getString(0),cursor.getString(1));
            buttonGroups.add(buttonGroup);
        }
    }
    cursor.close();
    return buttonGroups;
}

基本上我想把这些数据放在我的水平回收器视图中,触摸每个项目我应该知道哪个是点击但不知道为什么我会遇到这个错误请帮助我 这是我得到的错误

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mobex.inapp, PID: 17931
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
    at com.mobex.inapp.Adapter.ButtonGroupAdp.getItemCount(ButtonGroupAdp.java:81)
    at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:4044)
    at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3534)

【问题讨论】:

    标签: android android-studio android-fragments android-recyclerview


    【解决方案1】:

    您的mlistnull

    您首先需要初始化您的mlist,然后将其传递给您的ButtonGroupAdp 适配器,如下代码所示

    示例代码

    mlist = new ArrayList<>();
    badp = new ButtonGroupAdp(mlist, this);
    mlist =  mobexInAppDb.getAllProductList(site);
    myRecyclerView.setAdapter(badp);
    

    更新

    在 ArrayList 中添加数据后,您需要 notify 适配器

    mlist = new ArrayList<>();
    adp = new ButtonGroupAdp(mlist, this);
    myRecyclerView.setAdapter(badp);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mlist =  mobexInAppDb.getAllProductList(site);
    adp.notifyDataSetChanged();
    

    【讨论】:

    • 是的,问题已解决,但数据未在适配器上设置
    • 兄弟没有任何变化请看一下我的适配器代码我想我在那里犯了一些错误
    • @Ashishgupta 只是 setLayoutManager 到你的 mRecyclerView
    • @Ashishgupta 确保getAllProductList() 方法中的列表不为空,在列表中添加数据后尝试打印列表的大小
    • 有数据,因为在继续该方法 getAllproductList m 获得 10 个数据时,我已经调试并检查了它
    【解决方案2】:

    您必须在将您的 mList 传递给 ButtonGroupAdp 之前对其进行初始化

    这应该可以解决。

    只需替换

    List<ButtonGroup> mList;
    

    List<ButtonGroup> mList = new ArrayList<>();
    

    更新

    改变这个

    badp = new ButtonGroupAdp(mlist, this);
        mlist = new ArrayList<>();
        mlist =  mobexInAppDb.getAllProductList(site);
       myRecyclerView.setAdapter(badp);
    

    mlist = new ArrayList<>();
    badp = new ButtonGroupAdp(mlist, this);
    myRecyclerView.setAdapter(badp);
    myRecyclerView.setLayoutManager(new LinearLayoutManager(this, 
    LinearLayoutManager.HORIZONTAL, true));
    mlist =  mobexInAppDb.getAllProductList(site);
    badp.notifyDataSetChanged();
    

    【讨论】:

    • 是的,问题已解决,但数据未在适配器上设置
    • 如果没有,请添加mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
    • 请查看我的更新答案,了解您的水平回收站视图
    • 已更新,但回收站视图上仍然没有显示数据。
    • mlist = mobexInAppDb.getAllProductList(site);尝试将其更改为 mlist.addAll(mobexInAppDb.getAllProductList(site));然后在适配器上通知DataSetChanged
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2022-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多