Android ListView 만능 어댑터 인 스 턴 스 코드

16584 단어 AndroidListView
ListView 는 개발 에서 가장 많이 사용 되 는 컨트롤 이지 만 반복 되 는 코드 를 자주 써 서 시간 을 낭비 하 는 것 도 의미 가 없다.
최근 에 일부 자 료 를 참고 하여 만능 ListView 어댑터 를 발 견 했 습 니 다.코드 의 양 이 적 고 시간 을 절약 하 며 정리 해서 여러분 께 공유 하 겠 습 니 다.
먼저 사용자 정의 Adapter 가 BaseAdapter 에 계승 되 었 습 니 다.다음은 사용자 정의 Adapter 입 니 다.getView()방법 에 정수 가 있 습 니 다.

package com.example.mylistview.util;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public abstract class CommonAdapter<T> extends BaseAdapter {
 /**
  *    
  */
 private Context mContext;
 /**
  *      
  */
 private List<T> mDatas;
 private LayoutInflater mInflater;
 /**
  *   id
  */
 private int mlayoutId;

 public CommonAdapter(Context context, List<T> datas, int layoutId) {
  this.mContext = context;
  this.mDatas = datas;
  this.mlayoutId = layoutId;
  mInflater = LayoutInflater.from(context);
 }

 @Override
 public int getCount() {
  // TODO Auto-generated method stub
  return mDatas.size();
 }

 @Override
 public T getItem(int arg0) {
  // TODO Auto-generated method stub
  return mDatas.get(arg0);
 }

 @Override
 public long getItemId(int arg0) {
  // TODO Auto-generated method stub
  return arg0;
 }

 @Override
 public View getView(int arg0, View arg1, ViewGroup arg2) {
  // TODO Auto-generated method stub
  ViewHolder holder = ViewHolder.get(mContext, arg1, arg2, mlayoutId,
    arg0);
  convert(holder, getItem(arg0));

  return holder.getConvertView();
 }

 public abstract void convert(ViewHolder holder, T t);
}

이상 의 추상 적 인 방법 convert(ViewHolder holder,T t);이전 유 니 버 설 코드 에 해당 합 니 다.
viewHolder.mTextView = (TextView) convertView .findViewById(R.id.id_tv_title);
viewHolder.mTextView.setText(Bean.getName());
컨트롤 의 id 를 찾 아 시설 setText 등 중복 되 는 코드 방법 중의 매개 변수 ViewHolder holder,T t 를 찾 습 니 다.    holder 는 기 존의 유 니 버 설 코드 중의 view Holder 에 해당 하고 t 는 자신 이 정의 한 실체 클래스 Bean 에 해당 합 니 다.
상기 코드 중 getView()방법 중 하 나 는 ViewHolder 가 자신 이 설명 해 야 하 는 것 입 니 다.다음은 코드 와 상세 한 설명 입 니 다.

package com.example.mylistview.util;

import android.content.Context;
import android.graphics.Bitmap;
import android.renderscript.Type;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

public class ViewHolder {
 /**
  * SparseArray   View  
  */
 private SparseArray<View> mViews;
 /**
  * 
  */
 private int mPosition;
 /**
  *     
  */
 private View mConvertView;

 public View getConvertView() {
  return mConvertView;
 }

 public ViewHolder(Context context, ViewGroup parent, int layoutId,
   int position) {
  this.mViews = new SparseArray<View>();
  this.mPosition = position;
  this.mConvertView = LayoutInflater.from(context).inflate(layoutId,
    parent, false);
  this.mConvertView.setTag(this);
 }
 /**
  *     ViewHolder  
  * @param context
  * @param convertView
  * @param parent
  * @param layoutId
  * @param position
  * @return
  */
 public static ViewHolder get(Context context, View convertView,
   ViewGroup parent, int layoutId, int position) {
  if (null == convertView) {
   return new ViewHolder(context, parent, layoutId, position);
  } else {
   ViewHolder holder = (ViewHolder) convertView.getTag();
   holder.mPosition = position;
   return holder;
  }
 }
 /**
  *      id       ,       views
  * @param viewId
  * @return
  */
 public <T extends View> T getView(int viewId) {
  View view = mViews.get(viewId);

  if (null == view) {
   view = mConvertView.findViewById(viewId);
   mViews.put(viewId, view);
  }

  return (T) view;
 }
 /**
  *  TextView      
  * @param viewId
  * @param text
  * @return
  */
 public ViewHolder setText(int viewId, String text) {
  TextView tv = getView(viewId);
  tv.setText(text);
  return this;
 }
 /** 
  *  ImageView     
  * 
  * @param viewId 
  * @param drawableId 
  * @return 
  */ 
 public ViewHolder setImageResource(int viewId, int drawableId) 
 { 
  ImageView view = getView(viewId); 
  view.setImageResource(drawableId); 
  return this; 
 } 
 
 
 public int getPosition() 
 { 
  return mPosition; 
 } 
}

만능 어댑터 CommonAdapter 에 Adapter 를 하나 더 쓰 시 겠 습 니까?아니면 자신의 Adapter 를 쓰 시 겠 습 니까?하나의 항목 에 여러 개의 ListView 가 있 을 수 있 지만 모든 item 요소,레이아웃 이 다 를 수 있 습 니 다.이 눈물 은 서로 다른 ListView 와 자신 이 대응 하 는 item 을 구분 하 는 데 사 용 됩 니 다.이 코드 는 양 이 적 고 내부 클래스 로 Activity.java 에 쓸 수 있 습 니 다.

package com.example.mylistview.adapter;

import java.util.List;

import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.CheckBox;

import com.example.mylistview.R;
import com.example.mylistview.domain.Bean;
import com.example.mylistview.util.CommonAdapter;
import com.example.mylistview.util.ViewHolder;

public class MyAdapter extends CommonAdapter<Bean> {

 public MyAdapter(Context context, List<Bean> datas, int layoutId) {
  super(context, datas, layoutId);
  // TODO Auto-generated constructor stub
 }

 @Override
 public void convert(ViewHolder holder, final Bean bean) {
  // TODO Auto-generated method stub
  holder.setText(R.id.tv_title, bean.getTitle())
    .setText(R.id.tv_desc, bean.getDesc())
    .setText(R.id.tv_time, bean.getTime())
    .setText(R.id.tv_phone, bean.getPhone());
  /**
   *   CheckBox  
   */
  final CheckBox cBox = (CheckBox)(holder.getView(R.id.cb));
  if (cBox != null)
  {
   cBox.setChecked(bean.isChecked());

   cBox.setOnClickListener(new OnClickListener()
   {
    @Override
    public void onClick(View v)
    {
     bean.setChecked(cBox.isChecked());
    }
   });
  }
 }

}

최적화 후 어댑터 를 사용 할 때 훨씬 간단 합 니 다.다음은 실체 류,item 과 MainActivity.java 의 코드 입 니 다.
실체 클래스:

package com.example.mylistview.domain;

public class Bean {
 private String title;
 private String desc;
 private String time;
 private String phone;
 private boolean isChecked;

 public boolean isChecked() {
  return isChecked;
 }

 public void setChecked(boolean isChecked) {
  this.isChecked = isChecked;
 }

 /**
  * @param title
  * @param desc
  * @param time
  * @param phone
  */
 public Bean(String title, String desc, String time, String phone) {
  this.title = title;
  this.desc = desc;
  this.time = time;
  this.phone = phone;
 }

 public String getTitle() {
  return title;
 }

 public void setTitle(String title) {
  this.title = title;
 }

 public String getDesc() {
  return desc;
 }

 public void setDesc(String desc) {
  this.desc = desc;
 }

 public String getTime() {
  return time;
 }

 public void setTime(String time) {
  this.time = time;
 }

 public String getPhone() {
  return phone;
 }

 public void setPhone(String phone) {
  this.phone = phone;
 }

}

MainActivity.java:
핵심 코드:
매개 변 수 는 문맥,집합,자신 에 게 대응 하 는 item 이 있 으 면 됩 니 다.
 adapter = new MyAdapter(this, mDatas, R.layout.item);

package com.example.mylistview.ui;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

import com.example.mylistview.R;
import com.example.mylistview.adapter.MyAdapter;
import com.example.mylistview.domain.Bean;

public class MainActivity extends Activity {
 private ListView listView;
 private List<Bean> mDatas;
 /**
  *    
  */
 private MyAdapter adapter;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  initView();
  initData();
  listener();
 }

 private void listener() {
  // TODO Auto-generated method stub
  listView.setOnItemClickListener(new OnItemClickListener() {

   @Override
   public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
     long arg3) {
    // TODO Auto-generated method stub
    startActivity(new Intent(MainActivity.this, SecondActivity.class));
   }
  });
 }

 private void initData() {
  // TODO Auto-generated method stub
  mDatas = new ArrayList<Bean>();
  Bean bean = new Bean("Android    Get",
    "Android-     ListView GridView   ", "2015-08-05", "10086");
  mDatas.add(bean);
  bean = new Bean("       ",
    "           ", "2015-08-06", "10086");
  mDatas.add(bean);
  bean = new Bean("GetTOP  ",
    "       TOP  ", "2015-08-07", "10086");
  mDatas.add(bean);
 
  adapter = new MyAdapter(this, mDatas, R.layout.item);
  listView.setAdapter(adapter);
  
 }

 private void initView() {
  // TODO Auto-generated method stub
  listView = (ListView) findViewById(R.id.listView);
 }

}

항목 레이아웃:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:padding="10dp" >

 <CheckBox
  android:focusable="false"
  android:id="@+id/cb"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignParentRight="true"
  android:layout_centerInParent="true" />

 <TextView
  android:id="@+id/tv_title"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_marginTop="10dp"
  android:singleLine="true"
  android:text="Android    Get" />

 <TextView
  android:id="@+id/tv_desc"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_below="@id/tv_title"
  android:layout_marginTop="10dp"
  android:layout_toLeftOf="@id/cb"
  android:maxLines="2"
  android:text="Android-     ListView GridView   "
  android:textColor="#898989" />

 <TextView
  android:id="@+id/tv_time"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_below="@id/tv_desc"
  android:layout_marginTop="10dp"
  android:text="2015-08-05"
  android:textColor="#898989"
  android:textSize="12sp" />

 <TextView
  android:id="@+id/tv_phone"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_alignParentRight="true"
  android:layout_below="@id/tv_desc"
  android:layout_marginTop="10dp"
  android:background="#20793D"
  android:maxLines="1"
  android:text="10086"
  android:padding="4dp"
  android:textColor="#FFF" />

</RelativeLayout>

효과 그림:

이 걸 로 다른 레이아웃 에 맞 게:
새로운 레이아웃 의 Adapter 처럼 자신의 만능 adapter:CommonAdapter 를 계승 합 니 다.

package com.example.mylistview.adapter;

import java.util.List;
import java.util.Map;


import android.content.Context;

import com.example.mylistview.R;
import com.example.mylistview.util.CommonAdapter;
import com.example.mylistview.util.ViewHolder;

public class SecondAdapter extends CommonAdapter<Map<String, String>> {

 public SecondAdapter(Context context, List<Map<String, String>> datas,
   int layoutId) {
  super(context, datas, layoutId);
  // TODO Auto-generated constructor stub
 }

 @Override
 public void convert(ViewHolder holder, Map<String, String> t) {
  // TODO Auto-generated method stub
  holder.setText(R.id.tv_item2values, t.get("values"));
 }

}

Activity.java 코드:

package com.example.mylistview.ui;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

import com.example.mylistview.R;
import com.example.mylistview.adapter.MyAdapter;
import com.example.mylistview.adapter.SecondAdapter;

public class SecondActivity extends Activity {
 private ListView listView_second;
 private SecondAdapter secondAdapter;
 private List<Map<String, String>> lists = new ArrayList<Map<String, String>>();

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_second);
  initView();
  initData();
 }

 private void initData() {
  // TODO Auto-generated method stub
  for (int i = 0; i < 4; i++) {
   Map map = new HashMap<String, String>();
   map.put("values", "  " + i);
   lists.add(map);
  }
  secondAdapter = new SecondAdapter(this, lists, R.layout.item2);
  listView_second.setAdapter(secondAdapter);
 }

 private void initView() {
  // TODO Auto-generated method stub
  listView_second = (ListView) findViewById(R.id.listView_second);
 }

}

item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="horizontal" >

 

 <TextView
  android:id="@+id/tv_item2values"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center"
  android:text="ffffff"
  android:layout_margin="16dp"
  android:gravity="center" />

</LinearLayout>

효과 그림:

지금까지 안 드 로 이 드 였 습 니 다. ListView 의 자료 정리,여러분 에 게 도움 이 되 었 으 면 좋 겠 습 니 다!

좋은 웹페이지 즐겨찾기