Saya membuat aplikasi yang memiliki RecyclerView di dalam Fragmen untuk menampilkan data dari database. Beberapa minggu yang lalu saya membuat aplikasi lain dengan RecyclerView dengan paket dukungan Android dan semuanya baik-baik saja. Sekarang, dengan androidx, tampilan tidak menunjukkan apa-apa. Ini kelas RecyclerViewAdapter saya:

public class HistoryRecyclerViewAdapter extends RecyclerView.Adapter<HistoryRecyclerViewAdapter.ViewHolder> {
    private static final String TAG = "HistoryRecyclerView";

    private List<HistoryType> mHistory;

    HistoryRecyclerViewAdapter(List<HistoryType> history){
        mHistory = history;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);

        View historyView = inflater.inflate(R.layout.history_list_item,parent,false);

        ViewHolder viewHolder = new ViewHolder(historyView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        HistoryType history = mHistory.get(position);

        SimpleDateFormat formatter;
        Calendar calendar;


        TextView nameText = holder.mNameText;
        nameText.setText(history.getName());

        TextView durationText = holder.mDurationText;
        formatter = new SimpleDateFormat("HH:mm:ss");
        calendar = Calendar.getInstance();
        calendar.setTimeInMillis(history.getDuration());
        String durationString = formatter.format(calendar.getTime());
        durationText.setText(durationString);

        TextView distanceText = holder.mDistanceText;
        distanceText.setText(String.format("%.2f km",history.getDistance()));

        TextView totalAirTimeText = holder.mTotalAirTimeText;
        formatter = new SimpleDateFormat("mm:ss.SS");
        calendar = Calendar.getInstance();
        calendar.setTimeInMillis(history.getTotalAirTime());
        String totalAirTimeString = formatter.format(calendar.getTime());
        totalAirTimeText.setText(totalAirTimeString);

        TextView dateText= holder.mDateText;
        formatter = new SimpleDateFormat("dd MMMM yyyy");
        String dateString = formatter.format(history.getDate());
        dateText.setText(dateString);
    }

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


    public class ViewHolder extends RecyclerView.ViewHolder{

        public TextView mNameText;
        public TextView mDurationText;
        public TextView mDistanceText;
        public TextView mTotalAirTimeText;
        public TextView mDateText;

        public ViewHolder(View itemView) {
            super(itemView);

            mNameText = (TextView) itemView.findViewById(R.id.history_name);
            mDurationText = (TextView) itemView.findViewById(R.id.history_duration);
            mDistanceText = (TextView) itemView.findViewById(R.id.history_distance);
            mTotalAirTimeText = (TextView) itemView.findViewById(R.id.history_airtime);
            mDateText = (TextView) itemView.findViewById(R.id.history_date);

        }
    }

Dan di sini fragmen, memanggil adaptor (ArrayList memiliki satu item):

public class HistoryFragment extends Fragment {

    private ArrayList<HistoryType> mHistoryList = new ArrayList<>();
    private RecyclerView mRecyclerView;
    private HistoryRecyclerViewAdapter mHistoryAdapter;
    private SQLiteOpenHelper mSqliteOpenHelper;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_history, container, false);

        mRecyclerView = (RecyclerView) view.findViewById(R.id.history_recycler);

        return view;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mHistoryAdapter = new HistoryRecyclerViewAdapter(mHistoryList);

        mRecyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));
        mRecyclerView.setAdapter(mHistoryAdapter);

        mSqliteOpenHelper = new SQLiteOpenHelper(getActivity());
        mHistoryList = mSqliteOpenHelper.getHistory();

        for (HistoryType dataSet: mHistoryList) {
            mHistoryAdapter.notifyItemInserted(mHistoryList.indexOf(dataSet));
        }

    }

fragment_history.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/history_recycler"
    android:layout_marginLeft="@dimen/text_margin"
    android:layout_marginRight="@dimen/text_margin"
    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>

history_list_item.xml

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    //Name
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/history_name"
        android:layout_margin="@dimen/text_margin"
        android:text="activity name"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:textSize="@dimen/big_text_size"
        android:textStyle="bold"
        />

    //Duration
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/history_duration_icon"
        android:layout_marginTop="@dimen/text_margin"
        android:layout_marginRight="@dimen/icon_margin"
        android:layout_marginLeft="@dimen/text_margin"
        app:layout_constraintTop_toBottomOf="@id/history_name"
        app:layout_constraintLeft_toLeftOf="parent"
        android:background="@drawable/timer_24" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/history_duration"
        android:text="01.01.2021"
        android:layout_margin="@dimen/text_margin"
        app:layout_constraintTop_toBottomOf="@id/history_name"
        app:layout_constraintLeft_toRightOf="@id/history_duration_icon"
        android:textSize="@dimen/medium_text_size"/>

    //Distance
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/history_distance_icon"
        android:layout_marginTop="@dimen/text_margin"
        android:layout_marginLeft="@dimen/text_margin"
        android:layout_marginRight="@dimen/icon_margin"
        app:layout_constraintTop_toBottomOf="@id/history_name"
        app:layout_constraintLeft_toRightOf="@id/history_duration"
        android:background="@drawable/arrow_right_alt_24"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/history_distance"
        android:text="1h 35min"
        android:layout_marginTop="@dimen/text_margin"
        android:layout_marginLeft="@dimen/icon_margin"
        app:layout_constraintTop_toBottomOf="@id/history_name"
        app:layout_constraintLeft_toRightOf="@id/history_distance_icon"
        android:textSize="@dimen/medium_text_size"/>

    //Total Airtime
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/history_airtime_icon"
        android:layout_marginTop="@dimen/text_margin"
        android:layout_marginLeft="@dimen/text_margin"
        android:layout_marginRight="@dimen/icon_margin"
        app:layout_constraintTop_toBottomOf="@id/history_name"
        app:layout_constraintLeft_toRightOf="@id/history_distance"
        android:background="@drawable/keyboard_arrow_up_24"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/history_airtime"
        android:text="1h 35min"
        android:layout_marginTop="@dimen/text_margin"
        android:layout_marginLeft="@dimen/icon_margin"
        app:layout_constraintTop_toBottomOf="@id/history_name"
        app:layout_constraintLeft_toRightOf="@id/history_airtime_icon"
        android:textSize="@dimen/medium_text_size"/>

    //Date
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/history_date"
        android:text="01.01.2021"
        android:layout_margin="@dimen/text_margin"
        app:layout_constraintTop_toBottomOf="@id/history_duration_icon"
        app:layout_constraintLeft_toLeftOf="parent"
        android:textSize="@dimen/small_text_size" />


</androidx.constraintlayout.widget.ConstraintLayout>

Apakah seseorang membantu saya? Terima kasih banyak

1
Benne 4 Januari 2022, 17:19

1 menjawab

Jawaban Terbaik

Sejauh yang saya bisa lihat, Anda memiliki masalah dengan referensi Anda. Pertama, Anda mendeklarasikan adaptor Anda dengan instance kosong dari ArrayList, yang tidak masalah. Adaptor sekarang terhubung dengan ArrayList ini. Tapi kemudian Anda menetapkan kembali daftar ke contoh lain, yaitu, yang dikembalikan dari

mSqliteOpenHelper.getHistory()

Jika Anda membandingkan dua contoh, Anda akan melihat bahwa mereka tidak sama. Yang harus Anda lakukan adalah menambahkan hasil dari 'mSqliteOpenHelper.getHistory()' ke daftar yang sudah terhubung dengan adaptor (ArrayList kosong yang telah Anda tetapkan), menggunakan 'addAll()'.

EDIT: Hanya untuk membuat diri saya lebih jelas: Pada awalnya Anda mendeklarasikan dan menginisialisasi daftar Anda

private ArrayList<HistoryType> mHistoryList = new ArrayList<>();

Sebut saja instance ini Instance #1. Anda menetapkan Instance#1 sebagai sumber data ke adaptor. Adaptor sekarang memiliki sumber data kosong.

Setelah itu, Anda menetapkan kembali daftar ini

        mHistoryList = mSqliteOpenHelper.getHistory();

Ini adalah instance ArrayList yang berbeda, sebut saja Instance #2. Dan meskipun variabel mHistoryList menyimpan instance ini, adaptor masih ditautkan dengan Instance#1, hanya saja Anda tidak memiliki referensi ke sana lagi. Jadi adaptor ditautkan dengan ArrayList kosong (Instance#1), bukan yang memiliki data (Instance#2). Jangan menetapkan ulang variabel, buat itu final. ArrayList bisa berubah, jadi Anda bisa menambahkan data ke dalamnya. Jadi, tambahkan data ke dalamnya dan beri tahu adaptor bahwa itu telah diubah.

Beri tahu saya jika Anda memiliki pertanyaan

0
deluxe1 4 Januari 2022, 18:08
1
Terima kasih banyak!!!! itu masalah saya.
 – 
Benne
4 Januari 2022, 18:09
Sama-sama @Benne
 – 
deluxe1
4 Januari 2022, 18:17