Android ListView控件选中item项,并保持选中状态
2016-04-16 16:31
495 查看
这几天在做公司的项目,有这样一个需求,就是在listView里,点击item子项的时候需要保持item子项的选中状态,上网搜了一些资料,最后也实现了。现在就记录下来,一方面方便以后自己回顾好复习温故,另外也和大家分享。
不多说了,上代码。先贴xml布局文件的。
main.xml
item_module.xml
xml文件如果有问题的话就需要各位自己去稍微调整调整了。参考了网上的一些资料,都有自定义一个适配器,这里我自己也写了一个adapter。
这里有几点了,在getView()方法里可以看到,如果选中的项和适配器里的position相等的话,就改变item的背景色,但是在改变之前,要把TextView的的两项属性设置一下。
接下来就是activity了
不多说了,上代码。先贴xml布局文件的。
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/portalLinearLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <RelativeLayout android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="2" android:background="#cccccc" android:orientation="vertical" > <ListView android:id="@+id/testModuleListView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginTop="100dp" /> </LinearLayout>
item_module.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/portalLinearLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/itemName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:gravity="center" android:textSize="24px" /> </LinearLayout>
xml文件如果有问题的话就需要各位自己去稍微调整调整了。参考了网上的一些资料,都有自定义一个适配器,这里我自己也写了一个adapter。
public class CustomListViewAdapter extends BaseAdapter { private Context context; private List<Map<String, Object>> list; private int selectItem = -1; public CustomListViewAdapter(Context context, List<Map<String, Object>> maps) { this.context = context; this.list = maps; } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } public void setSelectItem(int selectItem) { this.selectItem = selectItem; } @SuppressLint("ResourceAsColor") @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder viewHolder = null; if (convertView == null && list.size() != 0) { viewHolder = new ViewHolder(); LayoutInflater inflater = LayoutInflater.from(context); convertView = inflater.inflate(R.layout.item_module, null); viewHolder.itemTextView = (TextView) convertView.findViewById(R.id.itemName); viewHolder.portalLinearLayout = (LinearLayout) convertView.findViewById(R.id.portalLinearLayout); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.itemTextView.setText(list.get(position).get("itemName").toString()); if (selectItem == position) { viewHolder.itemTextView.setSelected(true); viewHolder.itemTextView.setPressed(true); viewHolder.portalLinearLayout.setBackgroundColor(Color.YELLOW); } else { viewHolder.itemTextView.setSelected(false); viewHolder.itemTextView.setPressed(false); viewHolder.portalLinearLayout.setBackgroundColor(Color.TRANSPARENT); } return convertView; } private class ViewHolder { private TextView itemTextView; private LinearLayout portalLinearLayout; } }
这里有几点了,在getView()方法里可以看到,如果选中的项和适配器里的position相等的话,就改变item的背景色,但是在改变之前,要把TextView的的两项属性设置一下。
接下来就是activity了
public class PortalActivity extends FragmentActivity { private ListView testModuleListView; CustomListViewAdapter adapter; private String[][] itemStrings = new String[][] { { "1.xxxx", Ket }, { "2.xxxx", Ke }, { "3.xxxx", Keest }, { "4.xxxxx", Kt }, { "5.xxxxx", Kt }, { "6.xxxxx", Kst }, { "7.xxxxx", x }, { "8.xxxx", x }, { "9.xxxxx", t }, { "10.xxxxx", t }, { "11.xxxx", t }, { "12.x", t } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); bindViews(); initListView(); bindEvents(); } private void bindEvents() { testModuleListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Log.i("test", "点击了:" + position); Map<String, Object> appItem = (Map<String, Object>) parent .getItemAtPosition(position); adapter.setSelectItem(position); adapter.notifyDataSetInvalidated(); } }); private List<Map<String, Object>> initialModuleItem() { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map<String, Object> map; for (int i = 0; i < itemStrings.length; i++) { map = new HashMap<String, Object>(); map.put("itemName", itemStrings[i][0]); map.put("action", itemStrings[i][1]); list.add(map); } return list; } private void bindViews() { testModuleListView = (ListView) findViewById(R.id.testModuleListView); } private void initListView() { List<Map<String, Object>> maps = initialModuleItem(); adapter = new CustomListViewAdapter(this, maps); testModuleListView.setAdapter(adapter); } }这样以后就能实现了。
相关文章推荐
- Android 在界面中显示以及输入文本信息 TextView和EditText
- 使用ScrollView属性fillViewport解决android布局不能撑满全屏的问题
- Activity的生命周期和启动模式
- Android手机计步器中加速度传感器熄屏时的侦听
- Arrayadapter
- Android——黑名单管理
- Android——事务
- android开发小技巧
- 值得你关注的Android6.0上的重要变化(一)
- android 5.0获取前台应用的包名的实现方法
- Android电池记录总结
- Android: 横竖屏切换时候重新走Activity生命周期
- Android官方开发文档Training系列课程中文版:管理音频播放之音频输出硬件的处理
- android中versionCode&versionName
- Android项目结构介绍
- Android进阶——Handler的实际应用与多线程和界面的四种交互方式
- android中的异步任务-----------AsyncTask的使用
- Android系统用于Activity的标准Intent
- Android 使用Handler的PostDelayed方法实现图片的轮播
- siegen程的android技能树之回调函数(callback)