代码改变世界

Android初级教程_保留listview item的选中样式

2012-07-30 17:45  java线程例子  阅读(286)  评论(0编辑  收藏  举报

最近工作中需要实现"保存listview item的选中样式"的功能,这样当用户点击某个条目去查看详细信息,返回时可以知道上次查看了哪个条目.

现在把自己的研究成果共享给大家,共同进步!

一开始以为该功能很是简单,

首先新建一个Activity:

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		ArrayList<String> list = new ArrayList<String>();
		for (int i = 1; i <= 20; i++) {
			list.add("item " + i);
		}
		ListView listView = (ListView) findViewById(R.id.listview);
		listView.setAdapter(new MyAdapter(list));
		listView.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				TextView item = (TextView) view;
				item.setBackgroundResource(R.drawable.bg_article_listview_item_pressed);//把当前选中的条目加上选中效果
				if (last_item != -1 && last_item != position) {//如果已经单击过条目并且上次保存的item位置和当前位置不同
					// oldView.setBackgroundColor(Color.WHITE);
					oldView.setBackgroundResource(R.drawable.article_listview_item_bg);//把上次选中的样式去掉
				}
				oldView = item;//把当前的条目保存下来
				last_item = position;//把当前的位置保存下来
			}
		});
	}



新建相应的Adapter

	private final class MyAdapter extends BaseAdapter {
		TextView textView = null;
		private ArrayList<String> list = null;

		public MyAdapter(ArrayList<String> list) {
			this.list = list;
		}

		@Override
		public int getCount() {
			return list.size();
		}

		@Override
		public Object getItem(int position) {
			return list.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if (convertView == null) {
				textView = new TextView(ListViewDemoActivity.this);
			} else {
				textView = (TextView) convertView;
			}
			if (last_item == position) {//解决滑动listview的时候,选中的条目选中效果消失问题
				textView.setBackgroundResource(R.drawable.bg_article_listview_item_pressed);
			} else {
				textView.setBackgroundResource(R.drawable.article_listview_item_bg);
			}
			textView.setText(list.get(position));
			textView.setTextSize(50);
			return textView;
		}
	}

然后就是相应的布局文件和selector文件了:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bg_article_listview_item_pressed" android:state_selected="true"></item>
    <item android:drawable="@drawable/bg_article_listview_item_pressed" android:state_pressed="true"></item>
   <!--  <item android:drawable="@drawable/bg_article_listview_item_pressed" android:state_focused="true"></item> -->
    <item android:drawable="@android:color/transparent"></item>
</selector>

运行结果:

当listview没有上下滑动的时候是正常,当上下滑动的时候,选中其他条目的时候,上一个条目的选中效果不会消失,那么就出现了两个条目同时出现的.如下图所示:



出现上面的情况就是找不到原因,逻辑本来就是那样的,后来就在网上找到了相关的程序,


但是他选中的时候是用颜色来作为背景的,我是用selector xml文件实现的,难道就是这个原因吗?

后来我把所有的都设置都改成了颜色值,发现真的没有问题.但是我想这没有道理 啊,后来我看看我网上找的那个程序是怎么写的,发现在main.xml文件中多了一行这样的配置:



并且背景使用selector作为, 之后运行成功.

本文中的例子程序下载地址:http://download.csdn.net/detail/johnny901114/4464975

本例子参考的网上程序下载地址:http://download.csdn.net/detail/johnny901114/4464984


欢迎转载,转载请注明出处http://blog.csdn.net/johnny901114/article/details/7802763,谢谢!   如果还有其他问题欢迎留言..