본문 바로가기
안드로이드 스튜디오

수강신청 어플 만들기 - Android Studio with JAVA(3)-1

by s2jinny 2022. 12. 18.

(1편)회원가입->로그인(중복체크)->공지사항->강의 목록->시간표 추가 및 중복체크->시간표 조회

https://s2jinny.tistory.com/17

(2편)시간표 삭제->강의 경쟁률, 학점 제한

https://s2jinny.tistory.com/18

(3편)강의 인기 순위 리스트->어플리케이션 정보->개인정보 암호화-> 어플 개발

 

오늘은 3-1편 인 강의 인기 순위 리스트 (전체에서 가장 인기 많은 순)을 하겠다.

3편은 나누어서 하는 만큼 코드리뷰로 할 예정 ! 

완벽한 코드는 깃허브에 업로드 예정입니다.

우선 RankListAdapter.java 코드 설명 자세하게 하겠습니다.   어뎁터의 getView 속 부분을 보면 

 

public View getView(final int i, View view, ViewGroup viewGroup) {
    View v=View.inflate(context,R.layout.rank,null); 
    TextView rankTextView=(TextView)v.findViewById(R.id.rankTextView);
    TextView courseGrade =(TextView) v.findViewById(R.id.courseGrade);
    TextView courseTitle =(TextView) v.findViewById(R.id.courseTitle);
    TextView courseCredit=(TextView)v.findViewById(R.id.courseCredit);
    TextView courseDivide =(TextView) v.findViewById(R.id.courseDivide);
    TextView coursePersonnel =(TextView) v.findViewById(R.id.coursePersonnel);
    TextView courseProfessor =(TextView)v.findViewById(R.id.courseProfessor);
    TextView courseTime=(TextView) v.findViewById(R.id.courseTime);

 

우선 뷰에 rank 레이아웃을 사용한다고 한다. rank 레이아웃을 사용한다는 것이다.(이때 id가 아닌 layout이라는 것에 집중하자.)

 랭크 텍스트 뷰? 1위 2위...5위를 나타내는 텍스트 뷰

 강의 제목, 학년, 교수명 ,학점 , 분반, 인원제한, 시간대를 써줌.

 rankTextView.setText((i+1)+"위");
        if(i!=0){ //1위가 아니라면 칼라프라이머리 색상을 갖게 된다.
            rankTextView.setBackgroundColor(parent.getResources().getColor(com.google.android.material.R.color.design_default_color_primary));
        }

        if(courseList.get(i).getCourseGrade().equals("제한없음")||courseList.get(i).getCourseGrade().equals("")){
            courseGrade.setText("모든학년");
        }
        else{
            courseGrade.setText(courseList.get(i).getCourseGrade()+"학년");

        }

        courseTitle.setText(courseList.get(i).getCourseTitle());
        courseCredit.setText(courseList.get(i).getCourseCredit()+"학점");


        courseDivide.setText(courseList.get(i).getCourseDivide()+"분반");


        if(courseList.get(i).getCoursePersonnel()==0){
            courseGrade.setText("인원제한없음");
        }
        else {
            coursePersonnel.setText("제한인원: " + courseList.get(i).getCoursePersonnel()+" 명");
        }

        //만약에 교수 이름이 공백이라면 개인연구를 출력하고
        if(courseList.get(i).getCourseProfessor().equals("")){
            courseProfessor.setText("개인 연구");
        }
       else{ //교수이름이 적혀져있으면 그 해당 교수님이름을 불러온다.
           courseProfessor.setText(courseList.get(i).getCourseProfessor()+"교수님");
        }
       courseTime.setText(courseList.get(i).getCourseTime()+"");

        v.setTag(courseList.get(i).getCourseID());

        return v;
    }
}

 

다음 이어서 

rankTextView (순위 적는 부분) 정의해준다. 1위가 아니라면 색상은 컬러 프라이머 색상으로 하고

학년 제목 학점 분반 인원제한 시간대를 해당 학년 제목 학점 분반 인원제한 시간대로 불러온다. 

이때 courseList.get(i).getCourse~~() 로 불러오는데 중요한 것은 String 형태라면 뒤에 "" 을 붙여준다.(위 코드 참조)

 

StatisticsFragment.java 초기화: 

 private ListView courseListView;
 private StatisticsCourseListAdapter adapter;
 private List<Course> courseList;

// int totalCredit=0; //해당 학점 수

 public static int totalCredit=0; //학점 전체가 공통적으로 사용하기 떄문에
 public static TextView credit;

 private ArrayAdapter rankAdapter;
 private Spinner rankSpinner;

 //순위보여주는
 private ListView rankListView;
 private RankListAdapter rankListAdapter;
 private List<Course> rankList;

리스트뷰, 어뎁터연결시켜서 전체 강의 순위를 보여준다.

rankSpinner누르면 setOnItemSeletedListener에서 내가 values->arrays->string-array->itemt에 만들었던 것(전체에서, 여성.남성, 전공, 교양) 이라는 것 고르기 

 

    //순위보여주게
     rankListView=(ListView)getView().findViewById(R.id.rankListView);
     rankList=new ArrayList<Course>();
     rankListAdapter=new RankListAdapter(getContext().getApplicationContext(),rankList,this);
     rankListView.setAdapter(rankListAdapter);
     new ByEntire().execute(); //전체 강의 순위



    rankSpinner.setAdapter(rankAdapter);
    rankSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
            if(rankSpinner.getSelectedItem().equals("전체에서")){

            }
            else if(rankSpinner.getSelectedItem().equals("우리과에서")){

            }
           else if(rankSpinner.getSelectedItem().equals("남자 선호도")){

            }
            else if(rankSpinner.getSelectedItem().equals("여자 선호도")){

            }
            else if(rankSpinner.getSelectedItem().equals("전공 인기도")){

            }
            else if(rankSpinner.getSelectedItem().equals("교양 인기도")){

            }
        }

        @Override
        public void onNothingSelected(AdapterView<?> adapterView) {

        }
    });
}

 

ByEntire 에 AsyncTask 상속 ( 예전에 올린 블로그 자료 참조) 

   class ByEntire extends AsyncTask<Void,Void,String>{
        String target;

        @Override
        protected void onPreExecute() {
            try{
                target="http://***********.ivyro.net/ByEntire.php?userID="+ URLEncoder.encode(MainActivity.userID,"UTF-8");

            }catch (Exception e){
                e.printStackTrace();
            }
        }

        @Override
        protected String doInBackground(Void... voids) {
            try {
                URL url=new URL(target);
                HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection();
                InputStream inputStream=httpURLConnection.getInputStream(); //url에서 가져와서
                BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream)); //버퍼에 담아서 읽을 수 있도록
                String temp;
                StringBuilder stringBuilder=new StringBuilder();
                while((temp=bufferedReader.readLine())!=null){
                    stringBuilder.append(temp+"\n");
                }
                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();
                return stringBuilder.toString().trim();


            }catch (Exception e){
                e.printStackTrace();
            }

            return null;

        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(String result) {
            try{
                JSONObject jsonObject=new JSONObject(result);
                JSONArray jsonArray=jsonObject.getJSONArray("response");
                int count=0;
                int courseID;
                String courseGrade;
                String courseTitle;
                int courseDivide;

                String courseProfessor;
                int courseCredit;
                String courseTime;

                int coursePersonnel;
               // int courseRival;

                // String noticeContent, noticeName,noticeDate;
                while(count<jsonArray.length()){
                    JSONObject object=jsonArray.getJSONObject(count);
                    courseID=object.getInt("courseID");
                    courseGrade=object.getString("courseGrade");
                    courseTitle=object.getString("courseTitle");
                    courseDivide=object.getInt("courseDivide");
                    courseProfessor=object.getString("courseProfessor");
                    courseCredit=object.getInt("courseCredit");
                    courseTime=object.getString("courseTime");

                    coursePersonnel=object.getInt("coursePersonnel");
                 //   courseRival=object.getInt("COUNT(SCHEDULE.courseID)");
                  //  int courseCredit=object.getInt("courseCredit"); //courseCredit에 넣은다음
                    //totalCredit+=courseCredit; //토털 크리딧에 넣어서 형태체계적으로 바꿔준다.

                    // courseList.add(new Course(courseID,courseGrade,courseTitle,courseDivide,coursePersonnel,courseRival));
                  //  courseList.add(new Course(courseID,courseTitle,courseDivide,courseGrade,coursePersonnel,courseRival,courseCredit));

                    rankList.add(new Course( courseID,  courseGrade,  courseTitle,  courseCredit,  courseDivide,  coursePersonnel,  courseTime,courseProfessor));


                    count++;


                }
                rankListAdapter.notifyDataSetChanged(); //어뎁터새롭게 갱신

            }catch (Exception e){
                e.printStackTrace();
            }


        }
    }

Course.java 부분 수정 (이 부분 추가하기 !!) 

    public Course(int courseID, String courseGrade, String courseTitle, int courseCredit, int courseDivide, int coursePersonnel, String courseTime,String courseProfessor) {
        this.courseID = courseID;
        this.courseGrade = courseGrade;
        this.courseTitle = courseTitle;
        this.courseCredit = courseCredit;
        this.courseDivide = courseDivide;
        this.coursePersonnel = coursePersonnel;
        this.courseTime = courseTime;
        this.courseProfessor=courseProfessor;
    }

 

ByEntire.php 파일 FileZilla 에 올리고 php파일은 다음과 같다.

<?php
    $con = mysqli_connect('', '', '', '');
      mysqli_set_charset($con,"utf8");
      //가장 많이 선택한 강의를 내림차순으로 다섯개 
$result=mysqli_query($con,"SELECT COURSE.courseID,COURSE.courseGrade,COURSE.courseTitle, COURSE.courseProfessor, COURSE.courseCredit,COURSE.courseDivide,COURSE.coursePersonnel,COURSE.courseTime FROM COURSE,SCHEDULE WHERE COURSE.courseID=SCHEDULE.courseID GROUP BY SCHEDULE.courseID ORDER BY COUNT(SCHEDULE.courseID) DESC LIMIT 5");
$response = array();
      while($row=mysqli_fetch_array($result)){
         array_push($response,array("courseID"=>$row[0],"courseGrade"=>$row[1], "courseTitle"=>$row[2],"courseProfessor"=>$row[3],"courseCredit"=>$row[4],"courseDivide"=>$row[5],"coursePersonnel"=>$row[6],"courseTime"=>$row[7]));
      }

   echo json_encode(array("response"=>$response),JSON_UNESCAPED_UNICODE); //한글 출력
   mysqli_close($con);
 ?>

-> 자신의 호스팅 주소 구글에 쳐보기 -> 어떤 오류인지 php오류 잡을 수 있다.

php 오류 없고 이제 잘 작동하는지 확인 

 

1위 2위 3위 4위 5위까지 인기 순위 나옴. 

 

(3)-1편 끝 !!

 

너무 졸린 하루~ 내일 다시 3편 마무리 하겠습니다 ^_^