Android extends listview inside scrollview 取决于值的数量

Android extends listview inside scrollview depends on the number of value

我创建了一个由教师列表视图组成的应用程序,其中数据在 sqlite 中。当我单击其中一个列表视图时,将出现教师的个人资料,其中有一个学生列表。顺便说一句,老师的个人资料有一个滚动条,因为它有很多信息。我申请 the top answer here 所以列表视图会根据老师的学生人数自动扩展。但是当我应用这个时我得到了错误。我将 post 错误和下面的代码。

    public class MainActivity extends AppCompatActivity {

        Button btnback, btnnext, btnbackprofile;
        TextView profileteacher;


        List<TeacherModel> GetAllTeacher;
        List<StudentModel> GetTeacherStudent;
        Context context = this;
        DatabaseHelper dbhelper;
        DatabaseHelper db = new DatabaseHelper(this);
        ListView lv,lv2;
        View TeacherListView,TeacherProfileView;

        int index = 0;
        private int currentPageIndex = 0;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            dbhelper = new DatabaseHelper(MainActivity.this);

            try{
                dbhelper.createDataBase();
            }
            catch(IOException e){
                e.printStackTrace();
            }
            try {
                dbhelper.openDataBase();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //Till here
            GetAllTeacher = dbhelper.getAllTeacher(index);
            lv = (ListView) findViewById(R.id.teacher_list);
            lv.setAdapter(new ViewAdapter());

            /****************************************************************************************
             *                                  TEACHER PROFILE
             ****************************************************************************************/
            lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view,final int i, long l) {

                    GetTeacherStudent = dbhelper.getTeacherStudent(GetAllTeacher.get(i).getid());
                    TeacherListView = findViewById(R.id.teacherlayout);
                    ViewGroup parent = (ViewGroup) TeacherListView.getParent();
                    parent.removeView(TeacherListView);
                    // inflate your profile view (or get the reference to it if it's already inflated)
                    TeacherProfileView = getLayoutInflater().inflate(R.layout.profile_teacher, parent, false);
                    // add it to the parent
                    parent.addView(TeacherProfileView);

                    ListView listView = (ListView)view.findViewById(R.id.profileStudentList);
                    setListViewHeightBasedOnChildren(listView);
                    listView.setAdapter(new ViewAdapter2());



                    btnbackprofile = (Button) findViewById(R.id.profileTeacherBack);

                    btnbackprofile.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {

                            if (TeacherProfileView != null && TeacherProfileView.getParent() != null) {
                                // remove your profile view
                                ViewGroup parent = (ViewGroup) TeacherProfileView.getParent();
                                parent.removeView(TeacherProfileView);

                                // a reference to yourListView has to be saved somewhere; just get it

                                // add your listview to the parent
                                parent.addView(TeacherListView);
                            } else {
                            }


                        }
                    });

                    profileteacher = (TextView) findViewById(R.id.profileTeacherName);
                    profileteacher.setText(GetAllTeacher.get(i).getname());

                }
            });

            btnback = (Button) findViewById(R.id.teacherBack);
            btnnext = (Button) findViewById(R.id.teacherNext);

            btnback.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View convertView) {

                    currentPageIndex -= 20;
                    GetAllTeacher = dbhelper.getAllTeacher(currentPageIndex);
                    lv = (ListView) findViewById(R.id.teacher_list);
                    lv.setAdapter(new ViewAdapter());

                }

            });

            btnnext.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View convertView) {

                    currentPageIndex += 20;
                    GetAllTeacher = dbhelper.getAllTeacher(currentPageIndex);
                    lv = (ListView) findViewById(R.id.teacher_list);
                    lv.setAdapter(new ViewAdapter());

                }
            });



        }

/****************************************************************************************
         *                                      CODE IN THE LINK THAT I APPLY
         ****************************************************************************************/
        public static void setListViewHeightBasedOnChildren(ListView listView) {
            ListAdapter listAdapter = listView.getAdapter();
            if (listAdapter == null)
                return;

            int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.UNSPECIFIED);
            int totalHeight = 0;
            View view = null;
            for (int i = 0; i < listAdapter.getCount(); i++) {
                view = listAdapter.getView(i, view, listView);
                if (i == 0)
                    view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, AbsListView.LayoutParams.WRAP_CONTENT));

                view.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
                totalHeight += view.getMeasuredHeight();
            }
            ViewGroup.LayoutParams params = listView.getLayoutParams();
            params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
            listView.setLayoutParams(params);
        }


        /****************************************************************************************
         *                                      CUSTOM LIST
         ****************************************************************************************/
        public class ViewAdapter extends BaseAdapter {

            LayoutInflater mInflater;

            public ViewAdapter() {
                mInflater = LayoutInflater.from(context);
            }

            @Override
            public int getCount() {
                return GetAllTeacher.size();
            }

            @Override
            public Object getItem(int position) {
                return null;
            }

            @Override
            public long getItemId(int position) {
                return position;
            }

            @Override
            public View getView(final int position, View convertView, ViewGroup parent) {

                if (convertView == null) {
                    convertView = mInflater.inflate(R.layout.item_teacher,null);
                }

                final TextView names = (TextView) convertView.findViewById(R.id.teacherlist_name);
                final TextView gender = (TextView) convertView.findViewById(R.id.teacherlist_gender);

                names.setText("Dr. "+GetAllTeacher.get(position).getname());
                gender.setText(GetAllTeacher.get(position).getgender());

                return convertView;
            }
        }

        public class ViewAdapter2 extends BaseAdapter {

            LayoutInflater mInflater;

            public ViewAdapter2() {
                mInflater = LayoutInflater.from(context);
            }

            @Override
            public int getCount() {
                return GetTeacherStudent.size();
            }

            @Override
            public Object getItem(int position) {
                return null;
            }

            @Override
            public long getItemId(int position) {
                return position;
            }

            @Override
            public View getView(final int position, View convertView, ViewGroup parent) {

                if (convertView == null) {
                    convertView = mInflater.inflate(R.layout.item_teacherstudent,null);
                }

                final TextView names = (TextView) convertView.findViewById(R.id.teacherlist_name);

                names.setText(GetTeacherStudent.get(position).getstudent());

                return convertView;
            }
        }
    }

Error

Attempt to invoke virtual method 'android.widget.ListAdapter android.widget.ListView.getAdapter()' on a null object reference at com.example.jathniel.studentlist.MainActivity.setListViewHeightBasedOnChildren(MainActivity.java:243) at com.example.jathniel.studentlist.MainActivity.onItemClick(MainActivity.java:100)

Line 243: ListAdapter listAdapter = listView.getAdapter();

Line 100: setListViewHeightBasedOnChildren(listView);

为什么要在 setListViewHeightBasedOnChildren 中进入列表视图将其更改为这样 setListViewHeightBasedOnChildren() 并在 oncreate() ListView listView = (ListView)view.findViewById(R.id.profileStudentList); 中声明 然后尝试 编辑

在你的方法中把它改成这样:

 public static void setListViewHeightBasedOnChildren() {
            ListAdapter listAdapter = listView.getAdapter();
            if (listAdapter == null)
                return;

以及 oncreate() 方法

protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            dbhelper = new DatabaseHelper(MainActivity.this);

         listView = (ListView)findViewById(R.id.profileStudentList);

调换 100 号线和 101 号线。 作为第 101 行将适配器设置为 listView。

第 100 行尝试从 listView 获取适配器。

但是在第 100 行时,没有适配器设置为列表视图。所以会抛出空指针异常

所以代码会像这样

listView.setAdapter(new ViewAdapter2());
setListViewHeightBasedOnChildren(listView);