Android 二级ListView 列表
先看看运行的效果:
实现步骤:
首先自定义一个ListView,代码:MyLsitView.java
import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ListView; public class MyListView extends ListView implements Runnable { private float mLastDownY = 0f; private int mDistance = 0; private int mStep = 10; private boolean mPosirive = false; public MyListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public MyListView(Context context) { super(context); // TODO Auto-generated constructor stub } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (mLastDownY == 0f && mDistance == 0) { mLastDownY = event.getY(); return true; } break; case MotionEvent.ACTION_CANCEL: break; case MotionEvent.ACTION_UP: if (mDistance != 0) { mStep = 1; mPosirive = (mDistance >= 0); this.post(this); return true; } mLastDownY = 0f; mDistance = 0; break; case MotionEvent.ACTION_MOVE: if (mLastDownY != 0f) { mDistance = (int) (mLastDownY - event.getY()); if ((mDistance < 0 && getFirstVisiblePosition() == 0 && getChildAt( 0).getTop() == 0) || (mDistance > 0 && getLastVisiblePosition() == getCount() - 1)) { mDistance /=2; scrollTo(0, mDistance); return true; } } mDistance = 0; break; } return super.onTouchEvent(event); } @Override public void run() { mDistance += mDistance > 0 ? -mStep : mStep; scrollTo(0, mDistance); if (mPosirive && mDistance <=0 || (!mPosirive && mDistance >=0)) { scrollTo(0, 0); mDistance = 0; mLastDownY = 0f; return; } mStep += 1; this.postDelayed(this, 10); } }
首页: activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <com.example.momo.MyListView android:id="@+id/listView" android:layout_width="180dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@drawable/group_off" android:choiceMode="singleChoice" android:divider="@null" android:listSelector="#00000000" android:scrollbars="none" > </com.example.momo.MyListView> <com.example.momo.MyListView android:id="@+id/subListView" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:background="#ffffff" android:divider="@null" > </com.example.momo.MyListView> </LinearLayout>
activity_main.xml 自定义的ListView 横向布局,然后新建父ListView的适配器:MyAdapter.java
import android.content.Context; import android.graphics.Color; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.RelativeLayout; import android.widget.TextView; public class MyAdapter extends BaseAdapter { Context context; LayoutInflater inflater; String[] foods; int last_item; // int[] images; private int selectedPosition = -1; public MyAdapter(Context context, String[] foods) { this.context = context; this.foods = foods; // this.images = images; inflater = LayoutInflater.from(context); } @Override public int getCount() { // TODO Auto-generated method stub return foods.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = inflater.inflate(R.layout.mylist_item, null); holder = new ViewHolder(); holder.textView = (TextView) convertView .findViewById(R.id.textview); // holder.imageView = (ImageView) convertView // .findViewById(R.id.imageview); holder.layout = (RelativeLayout) convertView .findViewById(R.id.colorlayout); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 设置选中效果 if (selectedPosition == position) { holder.textView.setTextColor(Color.BLUE); holder.layout.setBackgroundResource(R.drawable.group_on); } else { holder.textView.setTextColor(Color.WHITE); holder.layout.setBackgroundColor(Color.TRANSPARENT); } holder.textView.setText(foods[position]); holder.textView.setTextColor(Color.BLACK); // holder.imageView.setBackgroundResource(images[position]); return convertView; } public static class ViewHolder { public TextView textView; // public ImageView imageView; public RelativeLayout layout; } public void setSelectedPosition(int position) { selectedPosition = position; } }
对应的布局:mylist_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <RelativeLayout android:id="@+id/colorlayout" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:layout_marginBottom="20dp" android:layout_marginTop="20dip" android:text="美食" android:textSize="16sp" /> </RelativeLayout> </LinearLayout>
然后是子适配器:SubAdapter.java
import android.content.Context; import android.graphics.Color; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class SubAdapter extends BaseAdapter { Context context; LayoutInflater layoutInflater; String[][] cities; public int foodpoition; public SubAdapter(Context context, String[][] cities, int position) { this.context = context; this.cities = cities; layoutInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); this.foodpoition = position; } @Override public int getCount() { // TODO Auto-generated method stub return cities.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return getItem(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; final int location = position; if (convertView == null) { convertView = layoutInflater.inflate(R.layout.sublist_item, null); viewHolder = new ViewHolder(); viewHolder.textView = (TextView) convertView .findViewById(R.id.textview1); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.textView.setText(cities[foodpoition][position]); viewHolder.textView.setTextColor(Color.BLACK); return convertView; } public static class ViewHolder { public TextView textView; } }
对应的布局:sublist_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:id="@+id/textview1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="8dip" android:layout_marginLeft="8dip" android:layout_marginTop="10dip" android:text="aaaaa" android:textSize="16sp" /> </LinearLayout>
最后是主activity的实现:MainActivity.java
import android.os.Bundle; import android.app.Activity; import android.view.View; import android.widget.AdapterView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; public class MainActivity extends Activity { private MyListView listView; private MyListView subListView; private MyAdapter myAdapter; private SubAdapter subAdapter; String cities[][] = new String[][] { new String[] { "全部美食", "本帮江浙菜", "川菜", "粤菜", "湘菜", "东北菜", "台湾菜", "新疆/清真", "素菜", "火锅", "自助餐", "小吃快餐", "日本", "韩国料理", "东南亚菜", "西餐", "面包甜点", "其他" }, new String[] { "全部休闲娱乐", "咖啡厅", "酒吧", "茶馆", "KTV", "电影院", "游乐游艺", "公园", "景点/郊游", "洗浴", "足浴按摩", "文化艺术", "DIY手工坊", "桌球馆", "桌面游戏", "更多休闲娱乐" }, new String[] { "全部购物", "综合商场", "服饰鞋包", "运动户外", "珠宝饰品", "化妆品", "数码家电", "亲子购物", "家居建材", "书店", "书店", "眼镜店", "特色集市", "更多购物场所", "食品茶酒", "超市/便利店", "药店" }, new String[] { "全部休闲娱乐", "咖啡厅", "酒吧", "茶馆", "KTV", "电影院", "游乐游艺", "公园", "景点/郊游", "洗浴", "足浴按摩", "文化艺术", "DIY手工坊", "桌球馆", "桌面游戏", "更多休闲娱乐" }, new String[] { "全", "咖啡厅", "酒吧", "茶馆", "KTV", "游乐游艺", "公园", "景点/郊游", "洗浴", "足浴按摩", "文化艺术", "DIY手工坊", "桌球馆", "桌面游戏", "更多休闲娱乐" }, new String[] { "全部", "咖啡厅", "酒吧", "茶馆", "电影院", "游乐游艺", "公园", "景点/郊游", "洗浴", "足浴按摩", "文化艺术", "DIY手工坊", "桌球馆", "桌面游戏", "更多休闲娱乐" }, new String[] { "全部休", "咖啡厅", "酒吧", "茶馆", "KTV", "电影院", "游乐游艺", "公园", "景点/郊游", "洗浴", "足浴按摩", "文化艺术", "DIY手工坊", "桌球馆", "桌面游戏", "更多休闲娱乐" }, new String[] { "全部休闲", "咖啡厅", "酒吧", "茶馆", "KTV", "电影院", "游乐游艺", "公园", "景点/郊游", "洗浴", "足浴按摩", "文化艺术", "DIY手工坊", "桌球馆", "桌面游戏", "更多休闲娱乐" }, new String[] { "全部休闲娱", "咖啡厅", "酒吧", "茶馆", "KTV", "电影院", "游乐游艺", "公园", "景点/郊游", "洗浴", "足浴按摩", "文化艺术", "DIY手工坊", "桌球馆", "桌面游戏" }, new String[] { "全部休闲娱乐", "咖啡厅", "酒吧", "茶馆", "KTV", "电影院", "游乐游艺", "公园", "景点/郊游", "洗浴", "足浴按摩", "文化艺术", "DIY手工坊", "桌球馆", "桌面游戏", "更多休闲娱乐" }, new String[] { "全部休闲aaa", "咖啡厅", "酒吧", "茶馆", "KTV", "电影院", "游乐游艺", "公园", "景点/郊游", "洗浴", "足浴按摩", "文化艺术", "DIY手工坊", "桌球馆", "桌面游戏" }, }; String foods[] = new String[] { "全部频道", "美食", "休闲娱乐", "购物", "酒店", "丽人", "运动健身", "结婚", "亲子", "爱车", "生活服务" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); myAdapter = new MyAdapter(getApplicationContext(), foods); listView.setAdapter(myAdapter); selectDefult(); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { final int location = position; myAdapter.setSelectedPosition(position); myAdapter.notifyDataSetInvalidated(); subAdapter = new SubAdapter(getApplicationContext(), cities, position); subListView.setAdapter(subAdapter); subListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { Toast.makeText(getApplicationContext(), cities[location][position], Toast.LENGTH_SHORT) .show(); } }); } }); } private void init() { listView = (MyListView) findViewById(R.id.listView); subListView = (MyListView) findViewById(R.id.subListView); } private void selectDefult() { final int location = 0; myAdapter.setSelectedPosition(0); myAdapter.notifyDataSetInvalidated(); subAdapter = new SubAdapter(getApplicationContext(), cities, 0); subListView.setAdapter(subAdapter); subListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { Toast.makeText(getApplicationContext(), cities[location][position], Toast.LENGTH_SHORT).show(); } }); } }