어댑터 간결한 쓰기

4867 단어

EasyListView


ListView를 사용할 때마다 어댑터를 써야 합니다.징그러운 것은 getView () 방법에 코드를 한 무더기 추가해야 하기 때문에 유지보수든 처음부터 쓰기든 매우 불편하다.이 프로젝트는 코드를 매우 간소화하고 코드를 더욱 모듈화할 수 있으며, 3단계만 있으면 하나의 어댑터를 실현할 수 있다.GitHub : https://github.com/jqzhang/EasyListView
아이디어 실현:
  • 서로 다른viewType에 따라 View 만들기
  • 귀속(프로젝트에서 Buttetknife로 실현)
  • 업데이트 View
  • 기본 코드:
    @Override
    public View getView(int position, View convertView, ViewGroup parent) { 
      ViewHolder vh;   
      //   view null             
      if (null == convertView || ((convertView.getTag() != null) && (((ViewHolder) convertView.getTag()).getType() != getItemViewType(position))))    {      
        vh = onCreateViewHolder(parent, position);          
        vh.setType(getItemViewType(position));   
      } else {      
        vh = (ViewHolder) convertView.getTag();   
      }   
      if (null == vh) {      
        return null;   
      }   
      vh.updateView(vh.getConvertView(), getItem(position), position);   
      return vh.getConvertView();
    }
    

    프로젝트 주소
    참고: 프로젝트에서 butterknife 사용

    단일 양식

  • 어댑터 구현
     class SingleTypeAdapter extends EasyBaseAdapter {
         List list = new ArrayList<>();
    
         @Override
         protected List getList() {
             if (list.size() > 0) {
                 return list;
             }
             //     
             for (int i = 0; i < 60; i++) {
                 SingleTypeActivity.Result result = new SingleTypeActivity.Result();
                 list.add(result);
             }
             return list;
         }
    
         //    Item ViewHolder
         @Override
         protected EasyBaseAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int position) {
             //    ItemView
             View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_1, null);
             return new SingleTypeViewHolder(view);
         }
     }
    
  • ViewHolder class Single Type ViewHolder extends Easy Base Adapter를 실현합니다.ViewHolder {
         @Bind(R.id.textView)
         TextView textView;
    
         public SingleTypeViewHolder(View view) {
             super(view);
         }
    
         @Override
         protected void updateView(View convertView, Result data, int position) {
             //   View 
             textView.setText(data.txt + position + "  " + (null == convertView));
         }
     }
    
  • listView 완성.setAdapter(new SingleTypeAdapter());

  • 여러 가지 스타일

  • Adapter class MutiType Adapter extends Easy Base Adapter {
         //         
         @Override
         public int getViewTypeCount() {
             return 2;
         }
    
         //         
         @Override
         public int getItemViewType(int position) {
             if (0 == position % 2) {
                 return 0;
             } else {
                 return 1;
             }
         }
    
         List list = new ArrayList<>();
    
         @Override
         protected List getList() {
    
             if (list.size() > 0) {
                 return list;
             }
             //     
             for (int i = 0; i < 60; i++) {
                 MutiTypeActivity.Result result = new MutiTypeActivity.Result();
                 list.add(result);
             }
             return list;
         }
    
         //    Item ViewHolder
         @Override
         protected EasyBaseAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int position) {
             //    ViewType    ItemView
             if (0 == getItemViewType(position)) {
                 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_1, null);
                 return new MutiTypeViewHolder1(view);
             } else {
                 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_2, null);
                 return new MutiTypeViewHolder2(view);
             }
         }
     }
    
  • 구현
  • ViewHolder class MutiType ViewHolder1 extends Easy Base Adapter를 실현한다.ViewHolder {
         @Bind(R.id.textView)
         TextView textView;
    
         public MutiTypeViewHolder1(View view) {
             super(view);
         }
    
         @Override
         protected void updateView(View convertView, Result data, int position) {
             //   View 
             textView.setText("   + " + position + "   " + (null == convertView));
         }
     }
    
     class MutiTypeViewHolder2 extends EasyBaseAdapter.ViewHolder {
    
         @Bind(R.id.imageView)
         ImageView imageView;
    
         public MutiTypeViewHolder2(View view) {
             super(view);
         }
    
         @Override
         protected void updateView(View convertView, Result data, int position) {
             //   View 
             imageView.setImageResource(R.mipmap.rr);
           }
     }
    
  • listView 완성.setAdapter(new SingleTypeAdapter());

  • 주의: 여러 스타일의ListView 어댑터에서 getViewTypeCount () 와 getItemViewType () 두 가지 방법을 반드시 실현해야 합니다.나머지는 그대로 옮기면 된다.

    좋은 웹페이지 즐겨찾기