ListView biến mất khi xoay màn hình

Chào anh chị. Em có một lỗi không hiểu ở đây. Chuyện là em có code 1 ListView sau khi em xoay màn hình thì cái ListView của em nó biến mất.
Màn hình lúc đầu:


Sau khi xoay

Em có dùng hàm onSaveInstanceState để lưu dữ lại dự liệu ArrayList(biến em đặt là list) và bundle em set key là listResult. Chỉ có cái ListView là mất còn dữ liệu trong ArrayList thì vẫn bình thường
Đây là em Log ra khi em nhấn nút Convert luôn cả trường hợp xoay màn hình và nhấn nút convert.

:frowning: ListView của em bị gì. Anh chị giúp đỡ em với

package com.example.tempconvert;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.PersistableBundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.Toast;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    RadioButton fToCRadio, cToFRadio;
    EditText editTextLeft, editTextRight;
    Button buttonConvert;
    ListView listView;
    ArrayList <String> list;
    ArrayAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mapping();

        buttonConvert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String textLeft;
                double result = 0;
                textLeft = editTextLeft.getText().toString();
                if(!textLeft.isEmpty()){
                    // check Radio button
                    if(fToCRadio.isChecked()){
                        result = ( Double.valueOf(textLeft) - 32.0 ) * 5.0 / 9.0;
                        result = (double) Math.round(result*100)/100;
                        list.add("F to C: " + textLeft+" => "+result);
                        editTextRight.setText(String.valueOf(result));
                        adapter.notifyDataSetChanged();
                    }else{
                        result = ( Double.valueOf(textLeft) * 9.0 / 5.0 ) + 32.0;
                        result = (double) Math.round(result*100)/100;
                        list.add("C to F: " + textLeft+" => "+result);
                        editTextRight.setText(String.valueOf(result));
                        adapter.notifyDataSetChanged();
                    }
                } else {
                    Toast.makeText(MainActivity.this,"Please enter something",Toast.LENGTH_SHORT).show();
                }
                Log.d("AAA",list.toString());
            }
        });

        if(savedInstanceState != null){
            list = savedInstanceState.getStringArrayList("listResult");
            adapter.notifyDataSetChanged();
            editTextLeft.setText(savedInstanceState.getString("editTextLeft"));
            editTextRight.setText(savedInstanceState.getString("editTextRight"));
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putStringArrayList("listResult",list);
        outState.putString("editTextLeft",editTextLeft.getText().toString());
        outState.putString("editTextRight",editTextRight.getText().toString());
    }

    public void mapping() {
        fToCRadio = findViewById(R.id.fToC);
        cToFRadio = findViewById(R.id.cToF);
        editTextLeft = findViewById(R.id.editTextLeft);
        editTextRight = findViewById(R.id.editTextRight);
        buttonConvert = findViewById(R.id.buttonConvert);
        listView = findViewById(R.id.listView);
        list = new ArrayList<>();
        adapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, list);
        listView.setAdapter(adapter);
    }
}

list ở đây và list của adapter là 2 list hoàn toàn khác nhau

3 Likes

Anh có thể giải thích khác như thế nào cho em được không a?

lí do cho những lỗi mà bạn thấy là do các vấn đề liên quan đến reference trong java. Chi tiết bạn xem tại link này


Ngoài ra có 1 ví dụ cho bạn thấy cách mà reference của các biến trong java hoạt động như sau:

class Dummy { // this class need to write in Dummy.java file
    int value = 0;
    public Dummy(int value) {
          this.value = value;
    }
}

class Ex { // this class need to write in Ex.java file
     static void swap(Dummy first, Dummy second) { // this function will not swap first with second of outter variable
          Dummy tmp = first;
          first = second;
          second = tmp;
     }
     
     static void change(Dummy var) {
          var.value = 1; // does change value prop from outer var
          var = new Dummy(1);
          var.value = 2; // does not effect outer var any more
     }
     
     public static void main(String[] args) {
         Dummy first = new Dummy(0);
         Dummy second = new Dummy(1);
         swap(first, second);
         change(first);
    }     
}

Thử và trải nghiệm nhé

4 Likes

A reference variable is declared to be of a specific type and that type can never be changed. Reference variables can be declared as static variables, instance variables, method parameters, or local variables.

À em hiểu rồi. Nghĩa khi mình khai báo 1 Object thì các biến trong này sẽ không thể thay đổi trực tiếp được. Ở đây là list.

list = new List(   ); // list 1
adapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, list);
list = new List() // list 2

====> list trong adapter không thể thay đổi được.
Nó chỉ được thay đổi bằng các method bên trong class

adapter.setList() (Giả dụ nếu có)


V đúng không anh?

đúng rồi đó bạn :v: -----

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?