ListView的item选中效果

有时app会需要点击某个item并实现选中的效果,例如做pad时用Fragment实现的左侧列表右侧内容的效果,点击左侧某一个item后会高亮选中

有时简单的使用setSelected(boolean b)或setSelection(int position)会不成功,需要重写Adapter,并在getView中进行处理

package com.example.selectitemtest;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private ListView lv;
    private List<Map<String, Object>> data;
    private MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView)findViewById(R.id.lv);
        //获取将要绑定的数据设置到data中
        data = getData();
        adapter = new MyAdapter(this);
        lv.setAdapter(adapter);
        lv.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
        lv.setOnItemClickListener(new ListView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                Toast.makeText(getApplicationContext(), "click position:"+arg2, Toast.LENGTH_SHORT).show();
                adapter.setSelectedItem(arg2);
                //adapter.notifyDataSetInvalidated();
            }
        });
    }
     private List<Map<String, Object>> getData()
        {
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            Map<String, Object> map;
            for(int i=0;i<10;i++)
            {
                map = new HashMap<String, Object>();
                map.put("img", R.drawable.ic_launcher);
                map.put("title", "花郎");
                map.put("info", "动力源于兴趣...");
                list.add(map);
            }
            return list;
        }

        //ViewHolder静态类
        static class ViewHolder
        {
            public ImageView img;
            public TextView title;
            public TextView info;
        }

        public class MyAdapter extends BaseAdapter
        {
            private LayoutInflater mInflater = null;
            private int selectedItem = -1;
            private MyAdapter(Context context)
            {
                //根据context上下文加载布局,这里的是Demo17Activity本身,即this
                this.mInflater = LayoutInflater.from(context);
            }

            @Override
            public int getCount() {
                //How many items are in the data set represented by this Adapter.
                //在此适配器中所代表的数据集中的条目数
                return data.size();
            }

            @Override
            public Object getItem(int position) {
                // Get the data item associated with the specified position in the data set.
                //获取数据集中与指定索引对应的数据项
                return position;
            }

            public void setSelectedItem(int selectedItem)
            {
                this.selectedItem = selectedItem;
            }

            @Override
            public long getItemId(int position) {
                //Get the row id associated with the specified position in the list.
                //获取在列表中与指定索引对应的行id
                return position;
            }

            //Get a View that displays the data at the specified position in the data set.
            //获取一个在数据集中指定索引的视图来显示数据
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder holder = null;
                //如果缓存convertView为空,则需要创建View
                if(convertView == null)
                {
                    holder = new ViewHolder();
                    //根据自定义的Item布局加载布局
                    convertView = mInflater.inflate(R.layout.list_item, null);
                    holder.img = (ImageView)convertView.findViewById(R.id.img);
                    holder.title = (TextView)convertView.findViewById(R.id.tv);
                    holder.info = (TextView)convertView.findViewById(R.id.info);
                    //将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出Tag
                    convertView.setTag(holder);
                }else
                {
                    holder = (ViewHolder)convertView.getTag();
                }
                holder.img.setBackgroundResource((Integer)data.get(position).get("img"));
                holder.title.setText((String)data.get(position).get("title"));
                holder.info.setText((String)data.get(position).get("info"));
                if(position == selectedItem)
                {
                    //convertView.setBackgroundColor(Color.BLUE);
                    //convertView.setSelected(true);
                    convertView.setBackgroundResource(R.drawable.all_listentry_left_selected);
                }else
                {
                    //convertView.setBackgroundColor(Color.GRAY);
                    //convertView.setSelected(false);
                    convertView.setBackgroundResource(R.drawable.lstview);
                }
                return convertView;
            }

        }
}

代码中红色标注处就是重点,lv.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);这句话必须要加

Defines the choice behavior for the List. By default, Lists do not have any choice behavior (CHOICE_MODE_NONE). By setting the choiceMode to CHOICE_MODE_SINGLE, the List allows up to one item to be in a chosen state. By setting the choiceMode to CHOICE_MODE_MULTIPLE, the list allows any number of items to be chosen.

实现效果如下

转自:http://www.cnblogs.com/loulijun/archive/2013/02/17/2914122.html

时间: 2024-12-28 17:52:12

ListView的item选中效果的相关文章

改变listview中item选中时文字的颜色

当listview的某个item选中时,默认有个选中的高亮显示,如果你要自定义选中时的高亮显示效果,可以在listview中设置属性 1 android:listSelector="@drawable/item_selector" 其中item_selector是在drawable目录下定义的一个xml文件,这种用于突出不同状态下显示效果的xml文件我们称之为selector: 1 2 3 4 5 6 7 <?xml version="1.0" encodin

android listview 不显示选中效果分析

android listview有时会发现没有选中效果,解决办法 1:listview布局中设置颜色,如 android:background="@android:color/white" 2:在listview的item布局文件中背景设置为 android:background="@android:color/transparent" 原因:颜色设置在整体的listview上面,每一行布局设置透明色即可 android listview 不显示选中效果分析

滑动删除ListView的Item的效果

本例子实现了滑动删除ListView的Itemdemo的效果.大家都知道.这种创意是来源于IOS的.左滑删除的功能.在Android上面实现比较麻烦.本例子中不仅实现了左滑删除功能.还实现了左滑赞.左滑分享.左滑收藏等功能.当然大家也可以根据自己项目的需求来修改功能.QQ和微信也实现了相同的功能.大家可以看看.先上程序运行的效果 采用的恶事一个开源库swipemenulistview.jar 代码如下 布局 <com.baoyz.swipemenulistview.SwipeMenuListVi

android listView二级目录选中效果

一.listView的二级目录且选中实现: 记录下来,以便以后可能会用到,直接上贴源码: 先上效果图:                   主界面: public class MainActivity extends Activity { // 树形Listview显示类别 private ExpandableListView listview1; // 一级 private List<String> groups; // 二级 private List<List<String&g

android listview级联三菜单选择地区,本地数据库sqlite级联地区,item选中不变色

前言:因为找了N多网上的资源都没有好的解决方案,别人都是只给思路没给具体源码,真TMD纠结,干嘛求别人,自己动手才是真,最痛恨那些所谓大牛的作风,给了点点代码就让别人去想,你让我们这种小白情何于堪!!!!!!此例是基于listview来实现本地sqlite实现的! 二话不说,程序猿求的是有图有真相有源码!大家下载后有什么问题可以找到本人:QQ508181017 核心代码如下 1.数据库操作类 package com.icq.demo.db; import java.util.ArrayList;

listview中item的各种进入乱入效果实现

今天给大家带来的,是使用开源项目ListviewAnimation(此项目在Github上已经停止维护),来实现listview控件中,item的各种进入效果,包括左侧进入,右侧进入,下侧进入,右下角进入,放大进入.卡片样式等效果. 废话不多说,先上效果图. 卡片效果 底部进入 右侧进入 左侧进入 右下角进入 放大进入 因为这个代码确实没什么讲头,也没什么难度,我直接上传代码,大家自己看吧 点击下载源码 listview中item的各种进入乱入效果实现

ListView 实现带有Filpper效果的左右滑动删除 Item

ListView 实现带有Filpper效果的左右滑动删除 Item  的实现最主要的方法还是 对 Listview 的继承重写 .然后是在删除过程中添加 TranslateAnimation 滑动事件. <span style="font-size:14px;">public class FilpperActivity extends Activity { private FilpperListvew flipperListView; private MyAdapter

Android DragAndDrop API 拖拽效果 交换ListView的Item值

前言 Android系统自API Level11开始添加了关于控件拖拽的相关API,可以方便的实现控件的一些拖拽效果,而且比自己用Touch事件写的效果更好.下面就来看下DragAndDrop吧. 使用Android的DragAndDrop框架,我们可以方便的在当前布局中用拖拽的形式实现两个View之间数据的互换.DragAndDrop框架包括一个拖拽事件的类,拖拽监听器,以及一些帮助方法和类. 尽管DragAndDrop主要是为了数据移动而设计,但是我们也可用他做别的UI处理.举个例子,我们可

请问下像内置mail应用那样的ListView带CheckBox的效果怎么做?

============问题描述============ 效果说明: 就像android系统内置的mail应用那样的列表 1.如图所示,每一个Item都是左边一个CheckBox,右边是内容. 2.如果单击左边CheckBox区域的话呢,会选中该项的CheckBox,不会打开内容. 3.如果单击右边的文本内容区域的话,会打开一个新的Activity,展示邮件正文内容. 4.通过多选后,可以一次批量对列表项进行删除操作. 这个效果,我想了下,没有想到好的头绪. 我自己定义了一个Item.xml,设