ListView 및 어댑터에 대한 고품질 프로그래밍 학습

- ListView
한 줄 한 줄의 스타일로 구성된 목록입니다.줄마다 똑같은 레이아웃이나 보기라고 하는데 보기 안에 데이터를 채우면 된다.ListView는 기본적으로 컨트롤입니다.
public class ListView extends AbsListView

public abstract class AbsListView extends AdapterView<ListAdapter> 
        implements TextWatcher,
        ViewTreeObserver.OnGlobalLayoutListener,
        Filter.FilterListener,
        ViewTreeObserver.OnTouchModeChangeListener,
        RemoteViewsAdapter.RemoteAdapterConnectionCallback

public abstract class AdapterView<T extends Adapter> extends ViewGroup

추상적인 AbsListView에 계승되고 AbsListView는 AdapterView에 계승되며 AdapterView는 ViewGroup에 계승된다. 이때 ViewGroup은 View에 계승된다는 것을 알게 되었다.그래서 본질적으로 ListView와 TextView, Button은 공통점이 있다.
- Adapter
어댑터, 보기의 존재에 데이터를 맞추고 해당 구성 요소에 데이터를 연결합니다.
- ListView 구현 단계
  • 1. Layout에 ListView 생성
  • 2, 줄마다 Layout 만들기
  • 3, 행당 데이터 생성/확보/지정
  • 4, 각 행의 뷰에 어댑터로 데이터 채우기
  • - 어댑터 데이터 바인딩
    전시해야 할 데이터가 유난히 많을 때, 수천 수만!미끄러질 때 매우 끊겨 보이는데, 특히 성능이 매우 나쁜 일부 기계에서는 더욱 뚜렷하다.따라서 어댑터를 데이터 바인딩할 때 최적화해야 합니다.ListView의 모든 줄은 하나의 보기이기 때문에 표시할 때 바로 그립니다. 미끄러질 때 그립니다.다음과 같은 방법을 사용하는 경우
    LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    convertView = layoutInflater.inflate(R.layout.list_item, null);

    줄마다 표시되는 Layout을 직접 가져오고convertView에서 줄마다 Layout의 View, 예를 들어 ImageView, TextView 등을 찾은 다음에 텍스트와 그림을 설정하면 효율이 낮아서 비슷한 코드를 반복적으로 실행하는 코드가 하나도 없다.로드 효율성을 위해 일반적으로 사용되는 두 가지 최적화 방법은 다음과 같습니다.
  • 캐시 convertView를 통해 캐시 convertView의 방식을 이용하여 캐시에 View가 존재하지 않으면 View를 만들 수 있고 이미 존재하면 직접 사용할 수 있음을 판단할 수 있다.
  • ViewHolder의 방식으로 ViewHolder의 정적 클래스를 만들고 데이터를 표시하는 보기(View)를 캐시하여 UI의 상응하는 속도를 높인다.convertView==null을 판단할 때 비어 있으면 설계된List의 Item 레이아웃에 따라convertView에 값을 부여하고viewHolder를 생성하여convertView 안의 각각의 View 컨트롤을 연결합니다.convertView의 setTag을 사용하여viewHolder를 Tag에 설정하여 convertView를 판단할 수 있도록 합니다!null일 때, convertView의 getTag () 를 사용하여 ViewHolder를 가져옵니다.

  • 일반적인 최적화 코드 어댑터 템플릿:
    public class ListAdapter extends BaseAdapter {
        //  List     
        List mList;
    
        public ListAdapter(List list) {
            mList = list;
        }
    
        @Override
        public int getCount() {
            //      
            return mList.size();
        }
    
        @Override
        public Object getItem(int position) {
            //    position        
            return mList.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            //    position         ID,      position    。
            return mList.get(position).getId();
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //   View Data         
            ViewHolder viewHolder;
            if (convertView == null) {
                LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
                viewHolder = new ViewHolder();
                convertView = layoutInflater.inflate(R.layout.list_item, null);
                viewHolder.imageView = convertView.findViewById(R.id.image_view);
                ....
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.imageView.setImageResource(R.drawable.ic_launcher);
            ...
            return convertView;
        }
    }
    
    static class ViewHolder {
        public ImageView imageView;
        ...
    }

    - ListView 클릭 이벤트의 두 가지 방법
  • 1. 어댑터의 GetView에서 구현됩니다.
  • convertView.setOnClickListener(...) //             
    viewHolder.imageView.setOnClickListener(...) //         View     
  • 2. ListView를 통해 구현됩니다.
  • listView.setAdapter(new ListAdapter(stringList));
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { //             
        @Override
        public void onItemClick(AdapterView> parent, View view, int position, long id) {
            ...
        }
    });
    
    listView.setOnLongClickListener(new View.OnLongClickListener() { //             
        @Override
        public boolean onLongClick(View v) {
            ...
            return false;
        }
    });

    좋은 웹페이지 즐겨찾기