Элементы не могут быть установлены в режиме ресайклера - PullRequest
0 голосов
/ 21 июня 2020

Код адаптера

 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)

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Ваш mlist равен null

Или сначала необходимо инициализировать ваш mlist, а затем передать его в адаптер ButtonGroupAdp, как показано ниже

КОД ОБРАЗЦА

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

ОБНОВЛЕНИЕ

Вам необходимо notify ваш адаптер после добавления данных в ваш ArrayList

mlist = new ArrayList<>();
adp = new ButtonGroupAdp(mlist, this);
myRecyclerView.setAdapter(badp);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mlist =  mobexInAppDb.getAllProductList(site);
adp.notifyDataSetChanged();
0 голосов
/ 21 июня 2020

Вам необходимо инициализировать свой 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();
...