Android片段更改后更新最后一个ListView

时间:2017-12-23 14:10:04

标签: android listview android-fragments

我有2个不同的片段,在第一个片段中,我正在为我的自定义学生ArrayList添加一个新的学生条目。我还有一个ListView在我的第二个片段中显示我的学生列表。但是,当我转到我的第二个片段时,它不会更新最新的ListView。所以我的问题是,在更改片段选项卡后如何更新ListView?

registerBtn只是向我的studentsArrayList添加一个新条目。

首先,我尝试使用“获取”按钮来更新我的ListView,但它无法正常工作。我想要做的是每当我传递给我的StudentsFragment时刷新我的ListView。

RegisterFragment.java:

package com.rawsly.android.schoolprogram;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Random;

public class RegisterFragment extends Fragment {
    private static final String TAG = "RegisterFragment";
    public ArrayList<Students> studentsArrayList = new ArrayList<>();
    private ArrayList<Long> idList = new ArrayList<>();
    private TextView studentID;
    private Button registerBtn, clearBtn, exitBtn;
    private EditText editName, editLastName, editGender, editFaculty, editDepartment, editAdvisor;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.register_fragment, container, false);

        studentID = (TextView) view.findViewById(R.id.studentID);
        studentID.setText(String.valueOf(generateID()));
        editName = (EditText) view.findViewById(R.id.editName);
        editLastName = (EditText) view.findViewById(R.id.editLastName);
        editGender = (EditText) view.findViewById(R.id.editGender);
        editFaculty = (EditText) view.findViewById(R.id.editFaculty);
        editDepartment = (EditText) view.findViewById(R.id.editDepartment);
        editAdvisor = (EditText) view.findViewById(R.id.editAdvisor);

        registerBtn = (Button) view.findViewById(R.id.registerBtn);
        registerBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String id = studentID.getText().toString();
                String name = editName.getText().toString();
                String lastName = editLastName.getText().toString();
                String gender = editGender.getText().toString();
                String faculty = editFaculty.getText().toString();
                String department = editDepartment.getText().toString();
                String advisor = editAdvisor.getText().toString();

                studentsArrayList.add(new Students(id, name, lastName, gender, faculty, department, advisor));
                Toast.makeText(getContext(), "New entry added.", Toast.LENGTH_SHORT).show();
            }
        });

        clearBtn = (Button) view.findViewById(R.id.clearBtn);
        clearBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                editName.setText(null);
                editLastName.setText(null);
                editGender.setText(null);
                editFaculty.setText(null);
                editDepartment.setText(null);
                editAdvisor.setText(null);
                studentID.setText(String.valueOf(generateID()));
            }
        });

        exitBtn = (Button) view.findViewById(R.id.exitBtn);
        exitBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                System.exit(1);
            }
        });

        return view;
    }

    // Generates a random ID.
    public long generateID() {
        Random rnd = new Random();
        char [] digits = new char[11];
        digits[0] = (char) (rnd.nextInt(9) + '1');
        for(int i=1; i<digits.length; i++) {
            digits[i] = (char) (rnd.nextInt(10) + '0');
        }
        long result = Long.parseLong(new String(digits));
        if(idList.contains(result)) {
            return generateID();
        } else {
            return result;
        }
    }
}

StudentsFragment.java:

package com.rawsly.android.schoolprogram;

import android.app.Dialog;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class StudentsFragment extends Fragment {
    private static final String TAG = "StudentsFragment";
    private EditText txtSearch;
    private ListView studentsListView;
    private Button getStudents, updateStudent, deleteStudent, exitBtn;
    public StudentsAdapter adapter;
    public ArrayList<Students> studentsArrayList = new ArrayList<>();;
    public int selectedItem = -1; // to update or delete the data

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.students_fragment, container, false);


        // Dummy Data
        studentsArrayList.add(new Students("1122334455", "Ahmet", "Özdemir", "Male", "Mühendislik ve Doğa Bilimleri", "Bilgisayar Mühendisliği", "Tuğba Yıldız"));
        studentsArrayList.add(new Students("1234567890", "Ezgi", "İmamoğlu", "Female", "Mühendislik ve Doğa Bilimleri", "Bilgisayar Mühendisliği", "Tuğba Yıldız"));
        studentsArrayList.add(new Students("0123456789", "Enise", "Usta", "Female", "Sosyal ve Beşeri Bilimler Fakültesi", "Uluslararası İlişkiler", "Murat Orhun"));
        studentsArrayList.add(new Students("1122445588", "Sinem", "Ünver", "Female", "Mühendislik ve Doğa Bilimleri", "Endüstri Mühendisliği", "Zehra Yılmaz"));
        studentsArrayList.add(new Students("2546882547", "Zehra", "Gürçay", "Female", "Mühendislik ve Doğa Bilimleri", "Endüstri Mühendisliği", "Şule Gündüz"));


        adapter = new StudentsAdapter(getContext(), studentsArrayList);

        studentsListView = (ListView) view.findViewById(R.id.studentsListView);
        studentsListView.setAdapter(adapter);

        studentsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                selectedItem = position;
                Toast.makeText(getContext(), "Selected entry: " + (selectedItem+1), Toast.LENGTH_LONG).show();
            }
        });

        // Opens a dialog window
        getStudents = (Button) view.findViewById(R.id.getStudents);
        getStudents.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                adapter.notifyDataSetChanged();
                studentsListView.invalidate();
            }
        }); // end of the add action

        // To delete the selected School object
        deleteStudent = (Button) view.findViewById(R.id.deleteStudent);
        deleteStudent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(selectedItem == -1) {
                    Toast.makeText(getContext(), "Please, select an entry first.", Toast.LENGTH_SHORT).show();
                } else {
                    studentsArrayList.remove(selectedItem);
                    selectedItem = -1;
                    adapter.notifyDataSetChanged();
                    Toast.makeText(getContext(), "Selected entry is deleted.", Toast.LENGTH_SHORT).show();
                }
            }
        }); // end of the delete action

        // To exit the program
        exitBtn = (Button) view.findViewById(R.id.exitBtn);
        exitBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                System.exit(1);
            }
        }); // end of the exit action

        // To update the selected School object
        updateStudent = (Button) view.findViewById(R.id.updateStudent);
        updateStudent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(selectedItem == -1) {
                    Toast.makeText(getContext(), "Please, select an entry first.", Toast.LENGTH_SHORT).show();
                } else {
                    final Dialog dialog = new Dialog(getContext());
                    dialog.setContentView(R.layout.update_student);
                    dialog.setTitle("Update An Entry");
                    // Dialog components - EditText, Button
                    String id = studentsArrayList.get(selectedItem).id;
                    String name = studentsArrayList.get(selectedItem).name;
                    String lastName = studentsArrayList.get(selectedItem).lastName;
                    String gender = studentsArrayList.get(selectedItem).gender;
                    String faculty = studentsArrayList.get(selectedItem).faculty;
                    String department = studentsArrayList.get(selectedItem).department;
                    String advisor = studentsArrayList.get(selectedItem).advisor;

                    final TextView studentID = (TextView) dialog.findViewById(R.id.studentID);
                    final EditText editName = (EditText) dialog.findViewById(R.id.editName);
                    final EditText editLastName = (EditText) dialog.findViewById(R.id.editLastName);
                    final EditText editGender = (EditText) dialog.findViewById(R.id.editGender);
                    final EditText editFaculty = (EditText) dialog.findViewById(R.id.editFaculty);
                    final EditText editDepartment = (EditText) dialog.findViewById(R.id.editDepartment);
                    final EditText editAdvisor = (EditText) dialog.findViewById(R.id.editAdvisor);

                    studentID.setText(id);
                    editName.setText(name);
                    editLastName.setText(lastName);
                    editGender.setText(gender);
                    editFaculty.setText(faculty);
                    editDepartment.setText(department);
                    editAdvisor.setText(advisor);

                    Button updateStudent = (Button) dialog.findViewById(R.id.updateStudent);
                    Button clearStudent = (Button) dialog.findViewById(R.id.clearStudent);
                    Button cancelStudent = (Button) dialog.findViewById(R.id.cancelStudent);

                    // Updates the selected School object
                    updateStudent.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            String id = studentID.getText().toString();
                            String name = editName.getText().toString();
                            String lastName = editLastName.getText().toString();
                            String gender = editGender.getText().toString();
                            String faculty = editFaculty.getText().toString();
                            String department = editDepartment.getText().toString();
                            String advisor = editAdvisor.getText().toString();
                            studentsArrayList.get(selectedItem).setId(id);
                            studentsArrayList.get(selectedItem).setName(name);
                            studentsArrayList.get(selectedItem).setLastName(lastName);
                            studentsArrayList.get(selectedItem).setGender(gender);
                            studentsArrayList.get(selectedItem).setFaculty(faculty);
                            studentsArrayList.get(selectedItem).setDepartment(department);
                            studentsArrayList.get(selectedItem).setAdvisor(advisor);

                            adapter.notifyDataSetChanged();
                            Toast.makeText(getContext(), "An entry is updated.", Toast.LENGTH_SHORT).show();
                            dialog.dismiss();
                        }
                    });

                    // Clears all fields
                    clearStudent.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            editName.setText(null);
                            editLastName.setText(null);
                            editGender.setText(null);
                            editFaculty.setText(null);
                            editDepartment.setText(null);
                            editAdvisor.setText(null);
                        }
                    });

                    // Dismisses the dialog
                    cancelStudent.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            dialog.dismiss();
                        }
                    });

                    dialog.show();
                    adapter.notifyDataSetChanged(); // notifying adapter about changes
                }
            }
        }); // end of the update action

        return view;
    }
}

1 个答案:

答案 0 :(得分:0)

&#34;故障处理

如果调用notifyDataSetChanged()并不起作用,则所有布局方法都不会有帮助。相信我ListView已正确更新。如果找不到差异,则需要检查适配器中的数据来自何处。

如果这只是一个集合,您将在内存中检查您是否在调用notifyDataSetChanged()之前实际删除了项目或将项目添加到集合中。

如果您正在使用数据库或服务后端,则在调用notifyDataSetChanged()之前,您必须再次调用该方法来检索信息(或操作内存数据)。

事情就是这个notifyDataSetChanged仅在数据集发生变化时才有效。如果您没有发现变化,那么这就是您要去的地方。如果需要调试。&#34;

重复:How to refresh Android listview?