Adapter

目录

1.Arrayadapter
列表的显示需要三个元素:

a.ListVeiw 用来展示列表的View。

b.适配器 用来把数据映射到ListView上的中介。

c.数据 具体的将被映射的字符串,图片,或者基本组件。

public class ListViewActivity extends Activity {

 private String array[]={"语文","数学","英语","计算机"};
       ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,array);//将array中数据以simple_list_item_1的方式传到this
       // ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.listview_item,array);
        mListViewDemo.setAdapter(adapter);//将适配器中的内容传到ListView中
}

SimpleAdapter

simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,ListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_margin="15dp">
        <ImageView
            android:id="@+id/imageview_student"
            android:layout_width="100dp"
            android:layout_height="100dp"

           />
        <TextView
            android:id="@+id/textview_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="姓名"
            android:layout_margin="10dp"
            android:gravity="center_vertical"/>
        <LinearLayout
            android:layout_margin="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <TextView
                android:id="@+id/textview_age"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="年龄"/>
            <TextView
                android:id="@+id/textview_sex"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="性别"/>
        </LinearLayout>
        <TextView
            android:layout_margin="10dp"
            android:id="@+id/textview_hobby"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="爱好"/>
    </LinearLayout>

</LinearLayout>

这里写图片描述

BaseAdapter

有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮。添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上。但是事实并非这样,因为按钮是无法映射的,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,而且必须要重写一个类继承BaseAdapter。下面的示例将显示一个按钮和一个图片,两行字如果单击按钮将删除此按钮的所在行。并告诉你ListView究竟是如何工作的。
这里写图片描述

public class AdapterFruit extends BaseAdapter{
    private LayoutInflater minflater;
    private List<Fruits> fruits;
    private boolean isChecked;

    public AdapterFruit(LayoutInflater inflater, List<Fruits> fruits) {
        this.minflater = inflater;
        this.fruits = fruits;

    }

    public boolean isChecked() {
        return isChecked;
    }

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


    @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) {
       Fruits fruit=fruits.get(position);
        ViewHolder vh=null;
        if(convertView==null){
            vh=new ViewHolder();
            convertView=minflater.inflate(R.layout.item_fruits,null);
            vh.checkBox= (CheckBox) convertView.findViewById(R.id.checkbox);
            vh.imageView= (ImageView) convertView.findViewById(R.id.image);
            vh.textView= (TextView) convertView.findViewById(R.id.textview_name);
            convertView.setTag(vh);
        }else {
            vh= (ViewHolder) convertView.getTag();

        }
        vh.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                fruits.get(position).setIsChecked(isChecked);
            }
        });
        vh.imageView.setImageResource(fruit.getmImageView());
        vh.checkBox.setChecked(fruit.isChecked());
        vh.textView.setText(fruit.getName());
        return convertView;
    }
    class ViewHolder{
        private CheckBox checkBox;
        private ImageView imageView;
        private TextView textView;
    }
}
public class MainActivity extends Activity {
private ListView mListView;
    private List<Fruits> mData;
    private   AdapterFruit adapterFruit;
    private    LayoutInflater inflater;
    private Button mBtnAllchecked;
    private View mHeaderview;
    private View mFooterview;
    private Button mBtnFan;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        inData();
        inflater=getLayoutInflater();
        mListView= (ListView) findViewById(R.id.listview);
        mFooterview=inflater.inflate(R.layout.fruit_fanxuan,null);
        mListView.addFooterView(mFooterview);
        mBtnFan= (Button)mFooterview.findViewById(R.id.btn_fanxuan);
        mBtnFan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                for (int i=0;i<mData.size();i++){
                    mData.get(i).setIsChecked(!mData.get(i).isChecked());
                }
                adapterFruit.notifyDataSetChanged();
            }
        });

        mHeaderview=inflater.inflate(R.layout.fruit_header,null);
        mListView.addHeaderView(mHeaderview);
        mBtnAllchecked= (Button) mHeaderview.findViewById(R.id.btn_allchecked);
        mBtnAllchecked.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                for (int i = 0; i < mData.size(); i++) {
                    mData.get(i).setIsChecked(true);
                }
                adapterFruit.notifyDataSetChanged();
            }
        });

        adapterFruit=new AdapterFruit(inflater,mData);
        mListView.setAdapter(adapterFruit);
        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
          mData.get(position-1).setIsChecked(!mData.get(position-1).isChecked());
            adapterFruit.notifyDataSetChanged();
        }
    });

    }
    private void inData(){
        mData=new ArrayList<>();
    for(int i=0;i<5;i++) {
    Fruits apple = new Fruits(R.drawable.apple, "苹果");
    mData.add(apple);
    Fruits banana = new Fruits(R.drawable.banana, "香蕉");
    mData.add(banana);
    Fruits dd = new Fruits(R.drawable.grape, "葡萄");
    mData.add(dd);
}

    }


}

注意

1.调用某一个对象,一定要在调用对象的代码上方创建(获取)改对象否则会报空指针。
2.在添加了HeadView后OnItemClickListener中的positon要-1,否则会出现偏差,因为HeadView本身占用了一个位置。
3.在向ListView中添加对象时,重复添加同一个对象会使在勾选某一个Checkbox时,同一对象都被选中。
4.在添加了Checkbox后,会使ListView的setOnItemClickListener失效,原因是事件会被子View捕获到,ListView无法捕获到该事件。解决办法:

 <CheckBox
            android:id="@+id/comment_item_user_sex"
            style="@style/TextTheme"
            android:focusable="false" //看这里
            android:gravity="center" />

5.再添加HeadView时注意要先获取再向ListView中添加,否则会在
mListView.setAdapter(adapter);这里报空指针;

mHeaderview=inflater.inflate(R.layout.fruit_header,null);
mListView.addHeaderView(mHeaderview);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值