步骤:
这里是用一个RelativeLayout实现ListView的一个title,在title中有一个Image通过点击这个image,来控制ListView的显示个数。
第一步:
新建两个类分别继承RelativeLayout和ListView(title的layout我就不写了,只要是开发的都会写)
public class SettingListView extends ListView {
public SettingListView(Context context) {
super(context);
}
public SettingListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SettingListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* @param widthMeasureSpec horizontal space requirements as imposed by the parent.
* The requirements are encoded with
* {@link MeasureSpec}.
* @param heightMeasureSpec vertical space requirements as imposed by the parent.
* The requirements are encoded with
* {@link MeasureSpec}.
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
onMeasure()函数是为了让ListView能够适应ScrollView,不然只能显示一行。
public class TitleSetting extends RelativeLayout {
protected LayoutInflater layoutInflater;
private ImageView title_pack_up;
protected TextView listview_title_text_dire, title_text_show;
private boolean showListViewAll = true;
private SettingAdapter mSettingAdapter;//持有外部类声明
public TitleSetting(Context context) {
super(context);
initView(context);
}
public TitleSetting(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public TitleSetting(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
private void initView(Context context) {
mSettingAdapter=new SettingAdapter(context);
layoutInflater = LayoutInflater.from(context);
layoutInflater.inflate(R.layout.apus_listview_title_setting, this);
listview_title_text_dire = (TextView) findViewById(R.id.listview_title_text_dire);
title_text_show = (TextView) findViewById(R.id.title_text_show);
title_pack_up = (ImageView) findViewById(R.id.title_pack_up);
title_pack_up.setBackgroundResource(R.drawable.down);
title_pack_up.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (showListViewAll) {
//show all listview(add item)
mSettingAdapter.addData();
title_pack_up.setBackgroundResource(R.drawable.up);
Log.i("TitleSetting","图片替换完毕");
showListViewAll=false;
} else {
//show part(delete item)
mSettingAdapter.deleteData();//回调
title_pack_up.setBackgroundResource(R.drawable.down);
showListViewAll=true;
}
}
});
}
}
第二步:建立布局文件
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/screen_contain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollbars="none">
<!--all View-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@color/background"
android:orientation="vertical"
android:paddingLeft="@dimen/screen_left"
android:paddingRight="@dimen/screen_right"
tools:context="com.zcl.myapp.MainActivity">
<!-- show setting-->
<com.zcl.myapp.allAdapter.TitleSetting
android:id="@+id/listview_title_setting"
android:layout_width="match_parent"
android:layout_height="40dp"
android:visibility="visible"
/>
<com.zcl.myapp.allAdapter.SettingListView
android:id="@+id/listView_settings"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@drawable/apus_divider_list"
android:dividerHeight="12dp"
android:visibility="visible"/>
</LinearLayout>
</ScrollView>
第三步:编写ListView对应的Adapter
import android.content.Context;
import android.content.res.Resources;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.apus.searchdesign.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by zcl
*/
public class SettingAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private List<Map<String, Object>> mData;
protected Resources res;
protected static List<Map<String, Object>> list;
private static class SettingViewHolder {
private ImageView settings_img;
private TextView settings_text_middle, settings_text_right;
}
public SettingAdapter(Context context) {
mInflater = LayoutInflater.from(context);
res = context.getResources();
mData = getData();
//刷新ListView
notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
SettingViewHolder holder = null;
if (convertView == null) {
holder = new SettingViewHolder();
convertView = mInflater.inflate(R.layout.listitem_settings, null);
//设置item的宽和高度,120是执行了dp到px计算之后的数字,1dp=2px
convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 120));
holder.settings_img = (ImageView) convertView.findViewById(R.id.settings_img);
holder.settings_text_middle = (TextView) convertView.findViewById(R.id.settings_text_middle);
holder.settings_text_right = (TextView) convertView.findViewById(R.id.settings_text_right);
convertView.setTag(holder);
} else {
holder = (SettingViewHolder) convertView.getTag();
}
holder.settings_img.setBackgroundResource((Integer) mData.get(position).get("settings_img"));
holder.settings_text_middle.setText((String) mData.get(position).get("settings_text_middle"));
holder.settings_text_right.setText((String) mData.get(position).get("settings_text_right"));
return convertView;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
private List<Map<String, Object>> getData() {
list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("settings_img", R.drawable.setting);
map.put("settings_text_middle", res.getStringArray(R.array.settings_text_middle)[0]);
map.put("settings_text_right", res.getStringArray(R.array.settings_text_right)[0]);
list.add(map);
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("settings_img", R.drawable.setting);
map1.put("settings_text_middle", res.getStringArray(R.array.settings_text_middle)[1]);
map1.put("settings_text_right", res.getStringArray(R.array.settings_text_right)[1]);
list.add(map1);
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("settings_img", R.drawable.setting);
map2.put("settings_text_middle", res.getStringArray(R.array.settings_text_middle)[2]);
map2.put("settings_text_right", res.getStringArray(R.array.settings_text_right)[2]);
list.add(map2);
return list;
}
protected void addData() {
Log.i("Setting", "增加之前" + list.size());
//待增加数据
Map<String, Object> map3 = new HashMap<String, Object>();
map3.put("settings_img", R.drawable.setting);
map3.put("settings_text_middle", res.getStringArray(R.array.settings_text_middle)[3]);
map3.put("settings_text_right", res.getStringArray(R.array.settings_text_right)[3]);
list.add(map3);
Map<String, Object> map4 = new HashMap<String, Object>();
map4.put("settings_img", R.drawable.setting);
map4.put("settings_text_middle", res.getStringArray(R.array.settings_text_middle)[4]);
map4.put("settings_text_right", res.getStringArray(R.array.settings_text_right)[4]);
list.add(map4);
Map<String, Object> map5 = new HashMap<String, Object>();
map5.put("settings_img", R.drawable.setting);
map5.put("settings_text_middle", res.getStringArray(R.array.settings_text_middle)[5]);
map5.put("settings_text_right", res.getStringArray(R.array.settings_text_right)[5]);
list.add(map5);
Log.i("Setting", "增加之后" + list.size());
}
protected void deleteData() {
Log.i("Setting", "删除之前" + list.size());
//从末尾往前删除,所以如果倒过来的话长度肯定是不会到6的,也即是5这一行会出错
list.remove(5);
list.remove(4);
list.remove(3);
Log.i("Setting", "删除之后" + list.size());
}
}
第四步:在MainActivity中实现绑定
//listView_settings
listView_settings = (ListView) findViewById(R.id.listView_settings);
SettingAdapter settingAdapter = new SettingAdapter(this);
listView_settings.setAdapter(settingAdapter);