Java에서 ListView 및 ArrayAdapter 사용

17460 단어 androidbeginnersjava
안드로이드 개발자로서 가능한 한 효율적으로 응용 프로그램을 개발하는 것이 중요하다.화면에 일련의 항목을 표시해야 할 때, 일반적인 방식으로 그것을 충전하는 것은 데이터의 사용에 현저한 영향을 미치기 때문에 매우 비싸다.따라서 AdapterView(예: ListView, GridView 또는 Spinner)와 Adapter(예: ArrayAdapter)를 사용하면 자원 사용을 줄일 수 있습니다.

왜 AdapterView 및 Adapter입니까?


화면에 일련의 항목을 표시할 때, 여러 가지 방법으로 실현할 수 있다.한 가지 방법은 LinearLayout을 사용하고 순환으로 하위 보기를 채우는 것이다.그러나 이런 방법은 대량의 메모리를 소모하기 때문에 취할 수 없다.소셜 미디어의 시간표나 기사나 뉴스의 요점 같은 항목들이 목록에 무더기로 전시되어 있다면 상상해 보세요.간단합니다. 모든 항목 목록을 구축하려면 많은 자원을 들여야 합니다.그러나 더 좋은 방법이 있다면, 응용 프로그램이 이 보기들을 채울 때 대량의 자원을 차지하지 않도록 하려면 어떻게 해야 합니까?이제 보기를 재활용할 수 있으므로 AdapterView와 Adapter를 함께 사용할 수 있습니다.

뷰 재확보란?


보기 회수는 매우 강력하고 중요한 개념이다.그것의 이름이 암시한 바와 같이 이런 관점은 순환적으로 이용되었다.그러나 너는 도대체 배후에서 무슨 일이 일어났는지 알아맞힐 수 있을 것이다.이 점을 이해하기 위해서 자세히 봅시다.
본고에서 우리는 ListView를 AdapterView의 하나로 사용하여 간단한 목록 레이아웃으로 프로젝트 목록을 표시하고 데이터 목록을 ArrayList에 저장하기를 원하기 때문에 ArrayAdapter을 어댑터로 선택했다.
고급 보기부터 시작합시다.ListViewArrayAdapter과 연결되었을 때 ArrayAdapter은 전체 화면 높이를 채울 수 있을 때까지 ListView의 하위 항목/목록 항목을 채우기 시작했다.여기에 추가 보기가 생성되지 않았음을 주의하십시오.따라서 5개의 항목이 화면에 들어갈 수 있다면 5개의 줄만 만들 수 있습니다.그런 다음 사용자가 화면 탐색 목록을 스크롤하면 해당 항목이 화면에서 사라지고 나중에 재사용할 수 있도록 메모리에 저장됩니다.나는 이것이 폐품 더미 같은 곳으로 보내진 것이라고 생각할 것이다.화면에 들어오는 새 항목은 폐품 더미의 옛 줄을 다시 사용해서 만든 것입니다. (데이터는 새 항목에 맞게 업데이트됩니다.) 

이 과정을 반복하면, 실례화된 줄 수가 매우 작기 때문에, 목록이 너무 길어도 자원 사용 상황을 성공적으로 저장할 수 있습니다.

기본 Array Adapter와 함께 ListView를 사용하는 방법


회수 보기를 어떻게 설정하는지 예를 들어 봅시다.프로그램의 화면에 최소한의 스타일로 학생의 이름을 표시하고 싶다고 가정하십시오.이것은 목록 항목으로 TextView이 필요하다는 것을 의미합니다.이 경우 ArrayAdapter을 초기화하여 ListView에 연결하면 됩니다.
// Instantiate an ArrayAdapter
ArrayAdapter studentNameAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, students);
// Getting an ID of ListView
ListView listView = (ListView) findViewById(R.id.list);
// Connect ListView and Adapter
listView.setAdapter(studentNameAdapter);
우선, 우리는 3개의 매개 변수를 전달함으로써 ArrayAdapter:context, 레이아웃과 데이터 그룹을 실례화했다.this에 대해 우리는 Context을 통과했다. 왜냐하면 이것은 현재의 활동을 대표하기 때문이다.우리는 simple_list_item_1을 레이아웃으로 선택했는데, 이것은 TextView만 포함한다.여기에 우리는 학생이라는 ArrayList이 있는데 일련의 학생들의 이름을 포함하고 우리의 세 번째 매개 변수로 전달된다고 가정한다.
이 모든 세부 사항을 제공한 후 ArrayAdapter은 어떻게 해야 할지 알았다.그래서 남은 것은 Adapter으로 ListView을 설치하는 것이다.ArrayAdapter은 사용하기 편하다고 말하고 싶어요!
기본적으로 ArrayAdapterView만 반환됩니다.이것은 네가 나타내고 싶은 것이 학생의 이름만이 아니라는 관건이다.

목록에 더 자세한 정보 보이기


지금까지 우리의 명단에는 단지 하나의 세부 사항, 학생 이름만 포함되어 있다.그러나 학생 등급이나 개인 정보 이미지 같은 세부 사항을 목록에 표시하려면 어떻게 해야 합니까?그러나 ArrayList은 단일 View으로 돌아올 것으로 예상된다.보아하니 우리는 우리의 새로운 데이터에 적응하기 위해 약간의 조정을 해야 할 것 같다.
다음은 할 일 목록입니다.
  • 모든 데이터 유형을 저장하기 위한 새로운 개체 생성 (TextView 2개 및 ImageView 1개)
  • 새로 작성된 객체(이름, 높이, 프로파일 이미지 포함)를 수용하기 위해 ArrayList 조정
  • 다중 데이터
  • 을 포함하는 ArrayAdapter 메서드의 기본 동작을 업데이트하기 위한 사용자 정의 getView() 만들기

    우리 하나씩 하나씩 봅시다.첫 번째 단계는 필요한 데이터를 저장하기 위해 새로운 대상을 만드는 것이다.우리가 설정할 필드는 이름, 등급, 프로필 이미지입니다.원하는 필드가 있는 새 클래스를 만들려면 다음과 같이 하십시오.
    // Student.java
    public class Student {
        private String mName;
        private String mLevel;
        private int mImageResourceId;
    
        public Student(String name, String level, int imageResourceId) {
            mName = name;
            mLevel = level;
            mImageResourceId = imageResourceId;
        }
    
        public String getName() { 
            return mName;
        }
    
        public String getLevel() {
            return mLevel;
        }
    
        public int getImageResourceId() {
            return mImageResourceId;
        }
    } 
    
    우리는 Student라는 새로운 공공반을 만들었다.변수 View을 실수로 업데이트되지 않도록 설정합니다.또한 Getter 방법을public로 설정하여 나중에 자세한 정보를 접근할 수 있도록 합니다.
    이 대상을 설정한 후, 이 세 가지 세부 사항을 충족시키기 위해 데이터 목록을 업데이트해야 합니다.현재 private은 다음과 같습니다.
    // Create an ArrayList with Student obj
    ArrayList<Student> studentList = new ArrayList<Student>();
    // Assign each details
    studentList.add(new Student("Jane", "Beginner", R.drawable.jane));
    studentList.add(new Student("Bob", "Intermediate", R.drawable.bob));
    studentList.add(new Student("Lisa", "Advanced", R.drawable.lisa));
    ...etc
    
    다음은 ArrayList을 확장하여 사용자 정의 Adapter을 만들어야 합니다.너는 그것에 적합한 이름을 지어줄 수 있지만, 이 예에서, 우리는 그것을 Student Adapter라고 부른다.
    // Creating a custom adapter by extending ArrayAdapter with Student data 
    public class StudentAdapter extends ArrayAdapter<Student> {
        // Set a custom constructer
        public StudentAdapter(Activity context, ArrayList<Word> studentList) {
        // The second parameter is 0 as we won't use constructer to inflate the views.
            super(context, 0, studentList);
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // Check if the existing view is being reused, otherwise inflate the view manually
            View listItemView = convertView;
            if(listItemView == null) {
                listItemView = LayoutInflater.from(getContext()).inflate(
                        R.layout.list_item, parent, false);
            }
    
            // Get the Student object located at the given position
            Student currentStudent = getItem(position);
    
            // Set up one of the TextViews with the name text obtained from the Student object
            TextView studentName = (TextView) listItemView.findViewById(R.id.name);
            studentName.setText(currentStudent.getName());
    
            // Set up the other TextView with the level text obtained from the Student object
            TextView studentLevel = (TextView) listItemView.findViewById(R.id.level);
            studentLevel.setText(currentStudent.getLevel());
    
    
            // Set up the ImageView with the resource ID obtained from the Student object
            ImageView imageView = (ImageView) listItemView.findViewById(R.id.image);
            imageView.setImageResource(currentStudent.getImageResourceId());
    
    
            // Return the list item layout (containing 2 TextViews and an ImageView)
            return listItemView;
        }
    }
    
    여기서 ArrayAdapter을 확장하여 StudentAdapter라는 사용자 정의 어댑터를 만들었습니다.또한 ArrayAdapter<Student>을 추가하여 어댑터에 사용할 데이터를 지정했습니다.그 중에서 우리는 <Student> 구조 함수(super에서 계승)를 설정했다. 여기서 주의해야 할 점은 우리가 레이아웃을 지정하지 않았다는 것이다.이 문제를 해결하기 위해서는 ArrayAdapter의 방법이 필요하기 때문이다.
    overriding getView() 방법을 계속 사용하면 우리는 먼저 getView()에 내용이 있는지 검사한다. 이것은 폐기물 더미에 낡은 줄이 있는지 없는지를 의미한다.만약 없다면, 우리는 수동으로 보기를 확대해야 한다.대부분의 경우, 활동이 방금 성명되었을 때 (예를 들어 사용자가 방금 화면을 열었을 때) 이렇게 해야 한다.
    만약 그것이 줄을 포함한다면, 우리는 하나의 보기로 돌아가기 전에 무엇을 해야 할지 지정할 수 있다.우리의 예에서 우리는 각각 convertView에 이름과 등급 텍스트(Student 대상에서 획득)를 설정했고 TextView에 이미지 자원 ID 1개를 설정했다.우리는 ImageView 방법과 최초로 getItem()에서 온 위치 정보를 사용하여 처리할 학생 데이터를 확정한다.
    위의 모든 작업을 완료한 후, 우리는 실례화된 StudentAdapter가 있는 ListView을 마지막 단계로 설정하기만 하면 된다.
    // Instantiate the custom ArrayAdapter called StudentAdapter
    StudentAdapter adapter = new StudentAdapter(this, studentList);
    
    // Getting an ID for the ListView
    ListView listView = (ListView) findViewById(R.id.list);
    
    // Set an adapter
    listView.setAdapter(adapter)
    

    요약


    우리는 이미 listViewListView을 완성하여 기본에서 맞춤형으로 사용하였다.이것은 내가 최근에 배운 항목 목록을 표시하는 방법 중의 하나다.나는 머지않아 내가 다른 선택을 만날 것이라고 확신한다.내가 이렇게 할 때, 나는 다른 문장을 써서 그들을 평가할 것이다.
    만약 당신이 나의 방법을 개선하는 대안이나 어떤 건의를 알고 있다면 언제든지 평론을 발표하세요.나는 2주 전에야 자바를 배우기 시작했다. 나는 전체 과정에서 가능한 한 많이 흡수하고 싶다!읽어주셔서 감사합니다.😄

    좋은 웹페이지 즐겨찾기