0

Я создал приложение, составленное из списка преподавателей, в котором данные находятся в sqlite. Когда я нажму на один из списков, появится профиль учителя, и в нем будет список учеников. Кстати, у профиля учителя есть свиток, так как у него много информации. Я применяю the top answer here, поэтому список будет автоматически расширяться, зависит от количества учеников учителя. Но я получил ошибку, когда я применяю это. Я отправлю сообщение об ошибке и мой код ниже.Android extends listview внутри scrollview зависит от количества значений

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; 
      } 
     } 
    } 

Ошибка

Попытка вызвать виртуальный метод 'android.widget.ListAdapter android.widget.ListView.getAdapter()' на нулевой ссылки на объект в com.example.jathniel.studentlist .MainActivity.setListViewHeightBasedOnChildren (MainActivity.java:243) на com.example.jathniel.studentlist.MainActivity $ 1.onItemClick (MainActivity.java:100)

Line 243: ListAdapter listAdapter = Li stView.getAdapter();

Линия 100: setListViewHeightBasedOnChildren (listView);

ответ

2

почему вы вводите вид списка в setListViewHeightBasedOnChildren изменить его в как этот setListViewHeightBasedOnChildren() и заявить об этом в oncreate()ListView listView = (ListView)view.findViewById(R.id.profileStudentList); попробуйте редактировать

в Вас способ изменить его нравится:

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

и on oncreate() method

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

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

на основе из того, что я понимаю, в том, что вы сказали. исправьте меня, если я ошибаюсь, я вставляю эту строку -> ListView listView = (ListView) findViewById (R.id.profileHospitalList); внутри private void setListViewHeightBasedOnChildren() { –

+0

попробуйте таким образом и скажите, будет ли он работать – Moudiz

+0

Ошибка в этой строке Список ListAdapterAdapter = listView.getAdapter(); и setListViewHeightBasedOnChildren(); –

0

Обмен вашей линией 100 и 101. Как установить адаптер 101 в listView.

И линия 100 попытается получить адаптер из спискаView.

Но во время строки 100 не будет установлен адаптер для просмотра списка. Таким образом, это приведет к исключению исключений из нулевого указателя.

Так код будет как этот

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

у меня все еще была ошибка –

+0

Какая ошибка?Можете ли вы опубликовать обновленный журнал? –

+0

вы сделали только обмен на размещение линий 100 и 101 вправо? –

Смежные вопросы