今天的内容是复习昨天的BasedView,并写一个相似的界面
界面设计
今天写的界面是复选框+图片+文本的组合,放在ListView中
细节方面,ListView每一项之间的间隔线换成绿色,ListView的最开头和最结尾分别添加一个按钮,为全选和反选,点击ListView的单项的时候,那个项会变化颜色。
activity_main——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=".MainActivity">
<ListView
android:id="@+id/fruit_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="#00000000"
android:divider="@color/green"
android:dividerHeight="1dp"
>
</ListView>
</RelativeLayout>
activity_fruit——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.example.administrator.adapter_project.Fruit_Activity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:background="@drawable/item_click"
android:orientation="horizontal">
<CheckBox
android:id="@+id/fruit_CheckBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:layout_margin="10dp"
android:text="选择水果"/>
<ImageView
android:id="@+id/fruit_ImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/fruit_TextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="水果名称"/>
</LinearLayout>
</RelativeLayout>
bottom_btn——底部的按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/bottom_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="反选"/>
</LinearLayout>
upper_btn——顶部的按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/upper_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全选"/>
</LinearLayout>
drawable中:item_click——点击单项变色(颜色的RGB值可以再在网上找)
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/gray" android:state_pressed="true"/>
<item android:drawable="@color/white"/>
</selector>
功能概述
运行后,用户单击某一个项目,项目会变色,然后对应的checkBox会自动勾选,但是如果项目的内容有重复的话,勾选一个不能让其他项目的都选上。
单击顶部的 全选 按钮,会让所有的checkBox勾选上,单击底部的 反选 按钮,会让所有的checkBox反选(打钩的变成不打钩的,不打勾的变成打钩的)。
这个界面是模拟用户选水果的,所以要首先定义一个水果的类,并给他赋予初始的属性和set get方法。checkBox用isChecked方法来表明是否选上。
class Fruit:
public class Fruit {
private String fruit_name;
private int fruit_img;
private boolean isChecked;
public String getFruit_name() {
return fruit_name;
}
public void setFruit_name(String fruit_name) {
this.fruit_name = fruit_name;
}
public int getFruit_img() {
return fruit_img;
}
public void setFruit_img(int fruit_img) {
this.fruit_img = fruit_img;
}
public boolean isChecked() {
return isChecked;
}
public void setIsChecked(boolean isChecked) {
this.isChecked = isChecked;
}
public Fruit(String fruit_name, int fruit_img) {
this.fruit_name = fruit_name;
this.fruit_img = fruit_img;
}
}
控制Adapter的类Fruit_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.example.administrator.adapter_project.R;
import com.example.administrator.adapter_project.modle.Fruit;
import java.util.List;
/**
* Created by Administrator on 2015/8/25.
*/
public class Fruit_Adapter extends BaseAdapter{
private List<Fruit> mData;
private LayoutInflater mInflater;
private boolean[] mCheckBoxManager;
//定义构造函数
public Fruit_Adapter(List<Fruit> mData, LayoutInflater inflater) {
this.mData = mData;
this.mInflater = inflater;
mCheckBoxManager = new boolean[mData.size()];
}
@Override
public int getCount() {
return mData.size();
}
//定义勾选与取消勾选的方法
public void clickToCheck(int position){
mCheckBoxManager[position] = !mCheckBoxManager[position];
notifyDataSetChanged();
}
@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) {
ViewHolder vh = null;
Fruit fruit = mData.get(position);
if(convertView==null){
convertView = mInflater.inflate(R.layout.activity_fruit_,null);
vh = new ViewHolder();
vh.fruit_CheckBox = (CheckBox) convertView.findViewById(R.id.fruit_CheckBox);
vh.fruit_ImageView = (ImageView) convertView.findViewById(R.id.fruit_ImageView);
vh.fruit_TextView = (TextView) convertView.findViewById(R.id.fruit_TextView);
convertView.setTag(vh);
}else{
vh = (ViewHolder) convertView.getTag();
}
vh.fruit_ImageView.setImageResource(fruit.getFruit_img());
vh.fruit_TextView.setText(fruit.getFruit_name());
//设置复选框的事件监听
vh.fruit_CheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mCheckBoxManager[position] = isChecked;
notifyDataSetChanged();
}
});
vh.fruit_CheckBox.setChecked(mCheckBoxManager[position]);
return convertView;
}
//因为是循环建立的内容,所以用一个ViewHolder方法避免重复获取ID,提高效率
class ViewHolder{
CheckBox fruit_CheckBox;
ImageView fruit_ImageView;
TextView fruit_TextView;
}
//定义全选的方法
public void checkAll(){
for (int i = 0;i<mCheckBoxManager.length;i++){
mCheckBoxManager[i] = true;
}
notifyDataSetChanged();
}
//定义反选的方法
public void checkFan(){
for (int i = 0;i<mCheckBoxManager.length;i++){
mCheckBoxManager[i] = !mCheckBoxManager[i];
}
notifyDataSetChanged();
}
}
运行主体的活动Fruit_Activity:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import com.example.administrator.adapter_project.adapter.Fruit_Adapter;
import com.example.administrator.adapter_project.modle.Fruit;
import java.util.ArrayList;
public class Fruit_Activity extends AppCompatActivity {
private ListView mListView;
private ArrayList<Fruit> mData;
private Fruit_Adapter mAdapter;
private View upperView;
private View bottomView;
private Button mBtnCheckAll;
private Button mBtnCheckFan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.fruit_list_view);
LayoutInflater inflater = getLayoutInflater();
initData();
mAdapter = new Fruit_Adapter(mData,inflater);
upperView = inflater.inflate(R.layout.upper_btn,null);
mBtnCheckAll = (Button)upperView.findViewById(R.id.upper_btn);
mBtnCheckAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mAdapter.checkAll();
}
});
mListView.addHeaderView(upperView);
bottomView = inflater.inflate(R.layout.bottom_btn,null);
mBtnCheckFan = (Button)bottomView.findViewById(R.id.bottom_btn);
mBtnCheckFan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mAdapter.checkFan();
}
});
mListView.addFooterView(bottomView);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mAdapter.clickToCheck(position - 1);
}
});
}
private void initData() {
mData = new ArrayList<>();
Fruit apple = new Fruit("苹果",R.mipmap.apple);
Fruit orange = new Fruit("橘子",R.mipmap.orange);
Fruit watermelon = new Fruit("西瓜",R.mipmap.watermelon);
Fruit coconut = new Fruit("椰子",R.mipmap.coconut);
for (int i= 0;i<10;i++){
mData.add(apple);
mData.add(orange);
mData.add(watermelon);
mData.add(coconut);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_fruit_, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
运行结果: