自定义adapter 及其性能优化_第1张图片

基本属性和常见问题

先来看看一些基本属性和常见问题。
listview 常用属性
cachecolorhint:缓存默认颜色一般给全透明
android:cacheColorHint=”#00ffffff”
divder:分隔线
android:divider=”#000000”
android:dividerHeight=”1dp”
改变按下的颜色:
item的背景改为drawable中的pressed.xml
加头部和底部:
默认position会加一
必须在setadapter之前加载

checkbox问题
。。。因为是同一个对象
adapter中有一个及时刷新的方法,在不滑动的情况下就可以刷新界面
notifyDataSetchange
一般在设置点击事件之后,都要使用该方法

点击事件问题:点击listview没有反应。只有点击checkbox才有反应
事件传递
屏幕 activity viewGroup
checkbox button
因为focusable默认为true
设为false则可以点击以外的区域

自定义的基本步骤

一,新建listview布局文件:listview只相当于书架

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.lingzhuo.test4.FriutActivity">    <ListView        android:id="@+id/mListViewFruit"        android:cacheColorHint="#00ffffff"        android:divider="#000000"        android:dividerHeight="1dp"        android:layout_width="match_parent"        android:layout_height="match_parent"        >    ListView>RelativeLayout>

二,自定义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"    android:gravity="center_vertical"    >    <CheckBox        android:id="@+id/mCheckBoxFruit"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:focusable="false"        android:text="选择水果"        />    <ImageView        android:id="@+id/mImageViewFruit"        android:layout_width="70dp"        android:layout_height="70dp"        />    <TextView        android:id="@+id/mTextViewFruit"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="水果的名字"        />LinearLayout>

定义model类来描述item的属性

package com.lingzhuo.test4.modle;/** * Created by heinika on 2015/8/25. */public class Fruit {    private String name;    private int image;    private boolean isChecked;    public boolean changeChecked(){        isChecked = !isChecked;        return isChecked;    }    public boolean getIsChecked() {        return isChecked;    }    public void setIsChecked(boolean isChecked) {        this.isChecked = isChecked;    }    public Fruit(String name, int image) {        this.name = name;        this.image = image;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getImage() {        return image;    }    public void setImage(int image) {        this.image = image;    }}

定义适配器实现baseadapter接口

package com.lingzhuo.test4.adapter;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.ImageView;import android.widget.TextView;import com.lingzhuo.test4.R;import com.lingzhuo.test4.modle.Fruit;import java.util.List;/** * Created by heinika on 2015/8/25. */public class FruitAdapter extends BaseAdapter{    private List fruits;    private LayoutInflater inflater;    private boolean isChecked;    public FruitAdapter(LayoutInflater inflater,List data){        this.inflater = inflater;        fruits = data;    }    @Override    public int getCount() {        return fruits.size();    }    @Override    public Object getItem(int position) {        return position;    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(final int position, View convertView, ViewGroup parent) {        Fruit fruit = fruits.get(position);        FruitHold fruitHold=null;        if(convertView==null){            fruitHold = new FruitHold();            convertView = inflater.inflate(R.layout.item_fruit_adapter,null);            fruitHold.mCheckBoxFruit = (CheckBox) convertView.findViewById(R.id.mCheckBoxFruit);            fruitHold.mImageViewFruit = (ImageView) convertView.findViewById(R.id.mImageViewFruit);            fruitHold.mTextViewFruit = (TextView) convertView.findViewById(R.id.mTextViewFruit);            convertView.setTag(fruitHold);        }else{            fruitHold = (FruitHold) convertView.getTag();        }        fruitHold.mImageViewFruit.setImageResource(fruit.getImage());        fruitHold.mTextViewFruit.setText(fruit.getName());        fruitHold.mCheckBoxFruit.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {            //局部变量只有转变为常量才能传入匿名内部类            @Override            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {                fruits.get(position).setIsChecked(isChecked);            }        });        fruitHold.mCheckBoxFruit.setChecked(fruit.getIsChecked());        return convertView;    }//    public void changeCheck(int position){//        fruits.get(position).setIsChecked(!fruits.get(position).getIsChecked());//        notifyDataSetChanged();                     //刷新数据//    }    public void allSelect(){        for(int i=0;itrue);        }        notifyDataSetChanged();    }    public void allRevrse(){        for(int i=0;i

在主类中找到listview并setadapter并监听事件

package com.lingzhuo.test4;import android.app.Activity;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.widget.AdapterView;import android.widget.Button;import android.widget.ListView;import com.lingzhuo.test4.adapter.FruitAdapter;import com.lingzhuo.test4.modle.Fruit;import java.util.ArrayList;public class FriutActivity extends Activity {    private ArrayList fruits;    private LayoutInflater inflater;    private ListView mListViewFruit;    private FruitAdapter fruitAdapter;    private View mHeaderView;    private Button mBtnAllSelect;    private Button mBtnAllRevrse;    private View mFootView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_friut);        mListViewFruit = (ListView) findViewById(R.id.mListViewFruit);        inflater = getLayoutInflater();   //只有activity才有getLayoutInflater()方法        fruits = initFruits();        fruitAdapter = new FruitAdapter(inflater,fruits);        mHeaderView = inflater.inflate(R.layout.all_select_button,null);        mListViewFruit.addHeaderView(mHeaderView);                          //会导致position加一        mBtnAllSelect = (Button) mHeaderView.findViewById(R.id.mBtnAllSelect);        mBtnAllSelect.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                fruitAdapter.allSelect();            }        });        mFootView = inflater.inflate(R.layout.all_revrse_button,null);        mListViewFruit.addFooterView(mFootView);        mBtnAllRevrse = (Button) mFootView.findViewById(R.id.mBtnAllRevrse);        mBtnAllRevrse.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                fruitAdapter.allRevrse();            }        });        mListViewFruit.setAdapter(fruitAdapter);        mListViewFruit.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                fruits.get(position-1).setIsChecked(fruits.get(position-1).changeChecked());    //当点击item                fruitAdapter.notifyDataSetChanged();                     //刷新数据            }        });    }    private ArrayList initFruits() {        fruits = new ArrayList();        for(int i =0;i<10;i++) {            fruits.add(new Fruit("apple", R.mipmap.apple));            fruits.add(new Fruit("pineapple", R.mipmap.pineapple));            fruits.add(new Fruit("strawberry", R.mipmap.strawberry));            fruits.add(new Fruit("watermelon", R.mipmap.watermelon));            fruits.add(new Fruit("apple", R.mipmap.apple));        }        return fruits;    }}

性能优化的具体分析

package com.lingzhuo.test4.adapter;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import com.lingzhuo.test4.R;import com.lingzhuo.test4.modle.Student;import java.util.List;/** * Created by Heinika on 2015/8/24. */public class StudentAdapter extends BaseAdapter{    private List mData;    private LayoutInflater mInflater;    //将inflater和数据传到适配器中    public StudentAdapter(LayoutInflater inflater,List data){        this.mInflater = inflater;        this.mData = data;    }    @Override    public int getCount() {        return mData.size();    }    @Override    public Object getItem(int position) {        return position;    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        Student student = mData.get(position);        ViewHold viewHold=null;        if(convertView==null){                                                            //只有充满的的时候才不为空            viewHold = new ViewHold();            convertView = mInflater.inflate(R.layout.item_simple_adapter,null);      //避免每次重复加载            viewHold.mImageViewPhoto = (ImageView) convertView.findViewById(R.id.mImageViewPhoto);  //findviewbyid为耗时操作            viewHold.textView_name = (TextView) convertView.findViewById(R.id.tv_name);              //只当convertView为空时才需要findviewbyid            viewHold.textView_age = (TextView) convertView.findViewById(R.id.tv_age);            viewHold.textView_sex = (TextView) convertView.findViewById(R.id.tv_sex);            convertView.setTag(viewHold);                                                  //将viewHold存到convertView        }else{                                                                          //convertView不为空的加载,convertView创建到一定个数就不再创建            viewHold = (ViewHold) convertView.getTag();        }        viewHold.mImageViewPhoto.setImageResource(student.getImgId());        viewHold.textView_name.setText(student.getName());        viewHold.textView_age.setText(student.getAge()+"");        viewHold.textView_sex.setText(student.getSex());        return convertView;    }    class ViewHold{        ImageView mImageViewPhoto;        TextView textView_name;        TextView textView_age;        TextView textView_sex;    }}

更多相关文章

  1. andriod线性布局部分用法
  2. Android Studio 之 AndroidManifest.xml文件中的android:label属
  3. 【ImageView】图片自适应及android:scaleType属性
  4. Android 属性总结
  5. Android中visibility的3个属性说明

随机推荐

  1. 【Android】socket局域网通信
  2. 升级android studio后编译的应用短暂白屏
  3. Android(安卓)Log升级版
  4. 对于Android代码保护过后软件的评估
  5. 开始今天的学习吧!Android开发Day1
  6. Android状态保存与恢复流程 完全解析
  7. 基于Android智能电视的应用程序的布局
  8. Android搜索实时显示功能实现
  9. Android的Google官方设计指南(上)
  10. Android缓存处理