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

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

ListView实现颜色变化的单选效果_第1张图片

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

布局文件

布局很简单,就是普通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的某一行时需要把点击位置传到适配器中,然后刷新适配器。

下载点这里

你可能感兴趣的:(ListView实现颜色变化的单选效果)