目录
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);