利用listview实现二级目录,自己写着玩玩,包含分割节点,代码如下
实体类ItemEntity:
public class ItemEntity {
/**数据类型:0-一级节点,1-分割节点,2-二级节点*/
public int type;
/**一级节点的状态:1-展开,0-关闭*/
public int state;
/**节点名称*/
public String name;
/**一级节点的次序*/
public int type0Index;
}
适配器MultiBaseAdapter:
public class MultiBaseAdapter extends BaseAdapter {
private Context context;
private ArrayList<ItemEntity> dataList;
public MultiBaseAdapter(Context context,ArrayList<ItemEntity> dataList){
this.context = context;
this.dataList = dataList;
}
public void reSetData(ArrayList<ItemEntity> newDataList){
this.dataList = newDataList;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return null == dataList ? 0 : dataList.size();
}
@Override
public Object getItem(int position) {
return null == dataList ? null : dataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public int getItemViewType(int position) {
ItemEntity entity = dataList.get(position);
return entity.type;
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public boolean isEnabled(int position) {
if (1 == getItemViewType(position)) {
return false;
}
return true;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (null == convertView) {
holder = new ViewHolder();
switch (getItemViewType(position)) {
case 0:
//一级节点
convertView = LayoutInflater.from(context).inflate(R.layout.item_first_level, null);
holder.tvIcon = (TextView) convertView.findViewById(R.id.tv_icon);
holder.tvName = (TextView) convertView.findViewById(R.id.tv_level_name);
break;
case 1:
//分割节点
convertView = LayoutInflater.from(context).inflate(R.layout.item_separator, null);
holder.tvName = (TextView) convertView.findViewById(R.id.tv_separator_name);
break;
default:
//二级节点
convertView = LayoutInflater.from(context).inflate(R.layout.item_second_level, null);
holder.tvName = (TextView) convertView.findViewById(R.id.tv_second_name);
break;
}
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
if (null != holder.tvIcon ) {
if (0 == dataList.get(position).state) {
holder.tvIcon.setText("+");
}else {
holder.tvIcon.setText("-");
}
}
if (null != holder.tvName) {
holder.tvName.setText(dataList.get(position).name);
}
return convertView;
}
private class ViewHolder{
public TextView tvIcon;
public TextView tvName;
}
}
主Activity:MainActivity
public class MainActivity extends Activity {
private ListView mListView;
private ArrayList<ItemEntity> dataList;
private MultiBaseAdapter mAdapter;
private HashMap<Integer, Boolean> colleptMap;
private int scrollPos = -1;
private int scrollTop = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
colleptMap = new HashMap<Integer, Boolean>();
colleptMap.put(0, true);
colleptMap.put(1, false);
colleptMap.put(2, true);
colleptMap.put(3, true);
colleptMap.put(4, true);
colleptMap.put(5, true);
dataList = new ArrayList<ItemEntity>();
mListView = (ListView) findViewById(R.id.lv);
initData();
mAdapter = new MultiBaseAdapter(this, dataList);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// Toast.makeText(MainActivity.this, dataList.get(arg2).name, Toast.LENGTH_SHORT).show();
if (0 == mAdapter.getItemViewType(arg2)) {
ItemEntity itemEntity = dataList.get(arg2);
int index = itemEntity.type0Index;
colleptMap.put(index, !colleptMap.get(index));
initData();
mAdapter.reSetData(dataList);
mAdapter.notifyDataSetChanged();
if (-1 != scrollPos && -1 != scrollTop) {
mListView.setSelectionFromTop(scrollPos,scrollTop);
}
}
}
});
mListView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
scrollPos = mListView.getFirstVisiblePosition();
}
View v = mListView.getChildAt(0);//getChildAt()只是当前屏内的
scrollTop = v == null ? 0 : v.getTop();
Log.d("111", "===scrollPos:"+scrollPos+";scrollTop:"+scrollTop);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
});
}
private void initData(){
dataList.clear();
for (int i = 0; i < 6; i++) {
//一级节点
ItemEntity entity = new ItemEntity();
entity.name = "第"+i+"组";
entity.type = 0;
entity.type0Index = i;
if (!colleptMap.get(i)) {
//该组收起
entity.state = 0;
dataList.add(entity);
continue;
}else {
//该组展开
entity.state = 1;
}
dataList.add(entity);
//分组节点
ItemEntity entity2 = new ItemEntity();
entity2.name = "这是分组item";
entity2.type = 1;
dataList.add(entity2);
//二级节点
for (int j = 0; j < 4; j++) {
ItemEntity entity3 = new ItemEntity();
entity3.name ="赵钱孙李"+j;
entity3.type = 2;
dataList.add(entity3);
}
}
}
}
三个布局文件
<LinearLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:cacheColorHint="@android:color/transparent" />
</LinearLayout>
<?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="wrap_content"
android:orientation="vertical"
android:background="@color/red">
<TextView
android:id="@+id/tv_separator_name"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:textStyle="bold"
android:textSize="20dp"
android:text="20-30"
android:gravity="center"
android:padding="5dp"/>
</LinearLayout>
<?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="vertical" >
<TextView
android:id="@+id/tv_second_name"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:textSize="30dp"
android:text="王大海"
android:padding="5dp"/>
</LinearLayout>
<?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="wrap_content"
android:orientation="horizontal"
android:background="@color/blue"
android:gravity="center_vertical">
<TextView
android:id="@+id/tv_icon"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_weight="0"
android:text="+"
android:layout_margin="10dp"
android:textStyle="bold"
android:textSize="30dp"/>
<TextView
android:id="@+id/tv_level_name"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_weight="1"
android:text="第一分组"/>
</LinearLayout>