получить массив из другого класса и показать его в закусочной

#java #android #arrays #android-studio

#java #Android #массивы #android-studio

Вопрос:

Я попытался получить массив из адаптера из своего кода

вот массив, который я хотел получить из своего адаптера, с именем MakananAdapter :

 private int[] JumlahPesan = {0,0,0,0};
 

Массив постоянно меняется, поскольку пользователь будет определять желаемую сумму, вот код onBindViewHolder:

 public void onBindViewHolder(@NonNull viewHolder holder, final int position) {
    ImageView ivMakanan = holder.ivMakanan;
    TextView tvNamaHarga = holder.tvNamaMakanan;
    TextView tvKetersediaan = holder.tvKetersediaan;
    TextView tvHarga = holder.tvHargaMakanan;
    final TextView tvPesanan = holder.tvJumlahPesanan;
    Button btnTambah = holder.btnTambah;
    Button btnKurang = holder.btnKurang;

    ivMakanan.setImageResource(makanans.get(position).getGambarMakanan());
    tvNamaHarga.setText(makanans.get(position).getNamaMakanan());
    tvKetersediaan.setText("Stok : "   makanans.get(position).getStatusMakanan());
    tvHarga.setText("Harga : "   makanans.get(position).getHargaMakanan());
    btnTambah.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            JumlahPesan[position]  ;
            tvPesanan.setText(String.valueOf(JumlahPesan[position]));
        }
    });
    btnKurang.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            JumlahPesan[position]--;
            tvPesanan.setText(String.valueOf(JumlahPesan[position]));
        }
    });
}
 

как вы можете видеть, я создаю кнопку, которая увеличивает и уменьшает данные массива

и я попытался получить данные массива для своей деятельности, но я все равно получаю ошибку.

моя активность с именем PilihMakananActivity.class

вот массив для сохранения данных из адаптера

 private int[] Pesanan = {0,0,0,0};
 

и я попытался получить данные в onResume

 protected void onResume() {
    super.onResume();
    com.example.iotforcanteen.adapter.MakananAdapter coba = null;
    for (int i = 0; i<4 ; i  ) {
        Pesanan [i]= coba.AmbilJumlahPesanan(i);
    }
}
 

и я попытался показать это в закусочной следующим образом

 btnKonfirmasi.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Snackbar.make(v, Pesanan[0]   Pesanan[1]   Pesanan[2]   Pesanan[3],Snackbar.LENGTH_SHORT).show();
    }
});
 

Мне очень жаль, если код такой грязный, потому что я новичок в Android development.so есть ли какой-нибудь способ исправить эту ошибку?

Ответ №1:

У него ошибка, потому что вы установили для своего адаптера нулевое значение в onResume. Но в целом я предполагаю, что вы используете RecyclerView в коде, поэтому шаги по использованию RecyclerView важны, сначала вы должны установить LayoutManager для RecyclerView. Затем создайте адаптер и установите для него значение RecyclerView, и я рекомендую вам выполнить эти действия в onCreate, а не onResume. Вот небольшой пример

     RecyclerView recyclerView = findViewById(R.id.rec);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    adapter = new MyRecyclerViewAdapter(this, list);
    recyclerView.setAdapter(adapter);
 

Также сделайте свой массив в адаптере общедоступным или напишите для него геттер. После вызова setAdapter для RecyclerView вы можете получить свои данные в адаптере. Например, вы можете определить кнопку и в OnClickListener получить желаемый массив (вот JumlahPesan) в адаптере

Ответ №2:

вы не инициируете этот адаптер ( null ) и несколькими строками ниже пытаетесь получить доступ к данным из него, это NullPointerException

 com.example.iotforcanteen.adapter.MakananAdapter coba = null;
for (int i = 0; i<4 ; i  ) {
    Pesanan [i]= coba.AmbilJumlahPesanan(i);
}
 

укажите ссылку на уже завершающий работу адаптер , подключенный к вашей ListView операционной RecyclerView системе , а не недавно созданный и вообще не инициализированный

обратите внимание, что onResume это вызывается один раз в начале, таким образом, у вас Pesanan не будет текущих данных, только копирование с начала Activity

может быть, просто получите ваши значения прямо при нажатии кнопки, без копирования массива в Activity :

 btnKonfirmasi.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Snackbar.make(coordinatorLayout,
            adapterAttachedToView.AmbilJumlahPesanan(0)   " "  
            adapterAttachedToView.AmbilJumlahPesanan(1)   " "   
            adapterAttachedToView.AmbilJumlahPesanan(2)   " "   
            adapterAttachedToView.AmbilJumlahPesanan(3),
            Snackbar.LENGTH_SHORT).show();
    }
});
 

обратите внимание, что Snackbar.make( следует взять View , в котором Snackbar появится, а не щелкнуть Button (вы переходите v к Snackbar.make )