ListView实现颜色变化的单选效果

来源:互联网 发布:淘宝产品拍摄相机选择 编辑:程序博客网 时间:2024/05/29 16:30

有的时候我们需要点击ListView的时候有一种单选的效果,例如:

这里写图片描述

这个功能既简单又实用,我把它记录在博客中,供自己和大家学习!


布局文件

布局很简单,就是普通ListView和item的布局:
activity_main.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout 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"    tools:context="com.sunao.yuandemo.MainActivity">    <ListView        android:id="@+id/lv_radio"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:dividerHeight="5dp"        /></RelativeLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent">    <TextView        android:id="@+id/tv_item"        android:layout_width="match_parent"        android:layout_height="40dp"        android:gravity="center"/></LinearLayout>

逻辑代码

适配器

首先看一下ListView的适配器,就是个简单的继承了BaseAdapter的适配器,我们实现单选效果,主要是给适配器设置一个变量-position,然后为变量提供set方法,供对应的Activity使用,下面是适配器的代码:
RadioListViewAdapter.java

/** * Created by yuankundong on 2016/02/28. */public class RadioListViewAdapter extends BaseAdapter{    private Context context;    private LayoutInflater inflater;    private List<String> itemList = new ArrayList<String>();    private int position = 0;//用于记录当前位置    public RadioListViewAdapter(Context context){        this.context = context;        inflater = LayoutInflater.from(context);    }    /*    * 用于设置当前位置    */    public void setPosition(int position) {        this.position = position;    }    public void setItems(List<String> itemList) {        this.itemList.clear();        this.itemList = itemList;        notifyDataSetChanged();    }    @Override    public int getCount() {        return itemList.size();    }    @Override    public Object getItem(int position) {        return itemList.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int i, View convertView, ViewGroup parent) {        ViewHolder holder = null;        if (convertView == null) {            holder = new ViewHolder();            convertView = inflater.inflate(R.layout.item, parent, false);            holder.tvItem = (TextView) convertView.findViewById(R.id.tv_item);            convertView.setTag(holder);        } else {            holder = (ViewHolder) convertView.getTag();        }        holder.tvItem.setText(itemList.get(i));        if (position == i) {            holder.tvItem.setTextColor(context.getResources().getColor(R.color.txt_white));            holder.tvItem.setBackgroundColor(context.getResources().getColor(R.color.bg_blue));        } else {            holder.tvItem.setTextColor(context.getResources().getColor(R.color.txt_black));            holder.tvItem.setBackgroundColor(context.getResources().getColor(R.color.bg_white));        }        return convertView;    }    class ViewHolder {        TextView tvItem;        }}

以上代码比较简单,就是判断当我们定义的变量position如果和geiView方法中的i一样的话,就代表选中的是这条,就把颜色设置成和其他不一样的。

MainActivity.java

在主Activity中,主要操作就是添加数据源,设置点击事件。

public class MainActivity extends AppCompatActivity {    private ListView listView;    private RadioListViewAdapter radioListViewAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //初始化listView控件        listView = (ListView) findViewById(R.id.lv_radio);        //实例化适配器,设置适配器        radioListViewAdapter = new RadioListViewAdapter(this);        listView.setAdapter(radioListViewAdapter);        //数据源        List<String> data = new ArrayList<>();        for (int i = 0; i < 10; i++) {            data.add("当前是" + i);        }        //设置数据        radioListViewAdapter.setItems(data);        //设置点击事件        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                //调用适配器中的setposition方法,把点击的positon传过去                radioListViewAdapter.setPosition(position);                //刷新适配器                radioListViewAdapter.notifyDataSetChanged();            }        });    }}

这样,我们就完成了文章一开始的效果,上面代码中主要的一个步骤就是在点击ListView的某一行时需要把点击位置传到适配器中,然后刷新适配器。

下载点这里

1 0
原创粉丝点击