Saya mencoba membuat tampilan Pendaur Ulang dengan beberapa elemen EditText dalam satu baris. Adaptor pendaur ulang dapat membuat elemen tetapi ketika saya mencoba mengatur teksnya, saya mendapatkan kesalahan.

Saya melakukan beberapa debugging dan ternyata onBindViewHolder() mendapatkan elemen EditText tersebut tetapi mereka null.

Saya tidak tahu apa yang harus dilakukan karena mereka dimuat dengan benar karena ketika saya mencetaknya di konstruktor mereka bukan null jadi tidak ada hubungannya dengan Id.

Berikut kodenya:

package com.example.recyclerviewtest;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

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

    private ArrayList<Exercise> exerciseList;

    public RecyclerAdapter(ArrayList<Exercise> exerciseList) {
        this.exerciseList = exerciseList;
    }

    public class MyViewHolder extends RecyclerView.ViewHolder{
        public EditText name;
        public EditText reps;
        public EditText sets;
        public EditText weight;

        public MyViewHolder(final View view) {
            super(view);
            EditText name = view.findViewById(R.id.exerciseName1);
            EditText reps = view.findViewById(R.id.reps1);
            EditText sets = view.findViewById(R.id.sets1);
            EditText weight = view.findViewById(R.id.weigh1);
            System.out.println(name);
        }
    }

    @NonNull
    @Override
    public RecyclerAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.singlerow,parent,false);
        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerAdapter.MyViewHolder holder, int position) {
        String Name = exerciseList.get(position).name;
        String Reps = String.valueOf(exerciseList.get(position).reps);
        String Sets = String.valueOf(exerciseList.get(position).sets);
        String Weight = String.valueOf(exerciseList.get(position).weight);



    //  holder.name.setText(Name);
    //  holder.reps.setText(Reps);
    //  holder.sets.setText(Sets)
    //  holder.weight.setText(Weight);
    }

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

Dan ini adalah xml untuk satu baris:


    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="8dp"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">


        <EditText
            android:id="@+id/exerciseName1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_centerVertical="true"
            android:hint="Exercise name"
            android:textSize="18sp"
            tools:layout_editor_absoluteX="24dp"
            tools:layout_editor_absoluteY="72dp" />

        <EditText
            android:id="@+id/sets1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@id/reps1"
            android:hint="Sets"
            android:inputType="numberSigned"
            android:paddingRight="16dp"
            android:textSize="18sp"
            tools:layout_editor_absoluteX="214dp"
            tools:layout_editor_absoluteY="72dp" />

        <EditText
            android:id="@+id/reps1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@id/linear1"
            android:hint="Reps"
            android:inputType="numberSigned"
            android:paddingRight="16dp"
            android:textSize="18sp"
            tools:layout_editor_absoluteX="274dp"
            tools:layout_editor_absoluteY="72dp" />

        <LinearLayout
            android:id="@+id/linear1"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_alignParentRight="true"
            android:minWidth="59dp"
            android:orientation="horizontal">

            <EditText
                android:id="@+id/weigh1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:inputType="numberDecimal"
                android:maxWidth="250dp"
                android:textAppearance="?android:attr/textAppearanceMedium" />

            <TextView
                android:id="@+id/value_unit_symbol"
                android:layout_width="wrap_content"
                android:layout_height="25dip"
                android:text="kg"
                android:textAppearance="?android:attr/textAppearanceMedium" />
        </LinearLayout>

    </RelativeLayout>
-2
Dejan Lisica 10 Januari 2021, 04:14

3 jawaban

Jawaban Terbaik
 public class MyViewHolder extends RecyclerView.ViewHolder{
    public EditText name;
    public EditText reps;
    public EditText sets;
    public EditText weight;

    public MyViewHolder(final View view) {
        super(view);
        EditText name = view.findViewById(R.id.exerciseName1);
        EditText reps = view.findViewById(R.id.reps1);
        EditText sets = view.findViewById(R.id.sets1);
        EditText weight = view.findViewById(R.id.weigh1);
        System.out.println(name);
    }
}

Mengapa Anda tidak mengubah seperti ini menjadi yang ini. ↓

     public class MyViewHolder extends RecyclerView.ViewHolder{
    public EditText name;
    public EditText reps;
    public EditText sets;
    public EditText weight;

    public MyViewHolder(final View view) {
        super(view);
        name = view.findViewById(R.id.exerciseName1);
        reps = view.findViewById(R.id.reps1);
        sets = view.findViewById(R.id.sets1);
        weight = view.findViewById(R.id.weigh1);
        System.out.println(name);
    }
}

Saya pikir Anda tidak perlu mendeklarasikan variabel sekali lagi. Jika Anda mendeklarasikan variabel di dalam lingkup MyViewHolder, itu tidak dapat diperiksa dari luar. Silakan coba cara ini dan jika Anda tidak dapat menyelesaikan masalah, silakan tulis komentar.

1
Lee WonJoong 10 Januari 2021, 01:26

Coba ubah ini ke kelas MyViewHolder Anda:

public class MyViewHolder extends RecyclerView.ViewHolder{    
        public EditText name; 
        public EditText reps;
        public EditText sets;
        public EditText weight;

        public MyViewHolder(final View view) {
            super(view);
            name = view.findViewById(R.id.exerciseName1);
            reps = view.findViewById(R.id.reps1);
            sets = view.findViewById(R.id.sets1);
            weight = view.findViewById(R.id.weigh1);
            System.out.println(name);
        }
    }

Apa yang Anda lakukan adalah Anda membuat variabel publik EditText dan kemudian membuatnya lagi di konstruktor Anda. Jadi Anda tidak menetapkan nilai ke variabel MyViewHolder Anda, tetapi membuat variabel lokal di dalam konstruktor. Kemudian setelah konstruktor selesai variabel tersebut dihapus dan tidak terlihat nanti.

0
SlothCoding 10 Januari 2021, 01:26

Di konstruktor ViewHolder Anda, misalnya nama EditText, Anda tidak menetapkan nilai ke variabel yang Anda buat di public EditText name tetapi Anda membuat objek EditText baru.

Alih-alih ini:

public class MyViewHolder extends RecyclerView.ViewHolder{
        public EditText name;
        public EditText reps;
        public EditText sets;
        public EditText weight;

        public MyViewHolder(final View view) {
            super(view);
            EditText name = view.findViewById(R.id.exerciseName1);
            EditText reps = view.findViewById(R.id.reps1);
            EditText sets = view.findViewById(R.id.sets1);
            EditText weight = view.findViewById(R.id.weigh1);
            System.out.println(name);
        }
    }

Melakukan hal ini:

public class MyViewHolder extends RecyclerView.ViewHolder{
        public EditText name;
        public EditText reps;
        public EditText sets;
        public EditText weight;

        public MyViewHolder(final View view) {
            super(view);
            name = view.findViewById(R.id.exerciseName1);
            reps = view.findViewById(R.id.reps1);
            sets = view.findViewById(R.id.sets1);
            weight = view.findViewById(R.id.weigh1);
            System.out.println(name);
        }
    }
0
danartillaga 10 Januari 2021, 07:35