android上改变listView的选中颜色
那如何改橙黄色为绿色呢?????
step1:list_item.xml中的代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="45dp"
android:orientation="vertical"
android:background="@drawable/list_item_bg"
>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical"
>
<TextView
.....
/>
<ImageView
....
/>
</RelativeLayout>
</LinearLayout>
============================================
drawable下的 list_item_bg.xml中的代码:
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true"
android:drawable="@color/blue" />
<item android:state_focused="true"
android:drawable="@color/blue" />
</selector>
step2:
list.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
arg1.setBackgroundResource(R.color.blue); //注意是这个方法o
.......
}});
}
注意:当完成第二步之后,再运行程序会发现有个小小的问题,当你点击item时,选中的颜色会先是默认的橙黄色,然后变成设置的绿色。所以我们需要进行step3。
step3:在myList.xml中的 ListView设置:
android:listSelector="@android :color/transparent" //将选中的默认设置为透明色
等同于: android:listSelector="#00000000"
这样就ok了
还有其他方法
ListView选中时默认是黄色,很多时候会和我们软件的配色不符合,那么我就教你如何修改默认的ListView配色,改变ListView选中颜色有两个方法:
1. 在程序中:
- Drawabledrawable=getResources().getDrawable(R.drawable.touch_feedback);
- ListView.setSelector(drawable);
Drawable drawable=getResources().getDrawable(R.drawable.touch_feedback); ListView.setSelector(drawable);
2. 在xml里面的ListView标签下添加:
- android:listSelector=”#00000000″//后面的颜色可以自己定这样写是透明的
android:listSelector=”#00000000″ //后面的颜色可以自己定这样写是透明的
记录和恢复ListView滚动的位置
有时候我们需要记录当前ListView滚动到的位置,重新加载的时候要回到原位,不罗嗦,给出代码:
- //列表滚动
- privateOnScrollListenerScrollLis=newOnScrollListener(){
- @Override
- publicvoidonScroll(AbsListViewarg0,intarg1,intarg2,intarg3){
- }
- @Override
- publicvoidonScrollStateChanged(AbsListViewview,intscrollState){
- if(scrollState==OnScrollListener.SCROLL_STATE_IDLE){
- ListPos=list.getFirstVisiblePosition();//ListPos记录当前可见的List顶端的一行的位置
- }
- }
- };
接下来就是还原位置,放在ListView加载之后:
- list.setSelection(ListPos);
list.setSelection(ListPos);
关于android ListView的美化
用心的朋友应该会发现,listview中在设置了背景之后。会有些问题。
1.、listview在拖动的时候背景图片消失变成黑色背景。等到拖动完毕我们自己的背景图片才显示出来。
2 、listview的上边和下边有黑色的阴影。
3、lsitview的每一项之间需要设置一个图片做为间隔。
针对以上问题 在listview的xml文件中设置一下语句。
问题1 有如下代码结解决 android:scrollingCache=”false” 或 android:cacheColorHint=”#00000000″
问题2 用如下代码解决:android:fadingEdge=”none”
问题3 用如下代码解决: android:divider=”@drawable/list_driver” 其中 @drawable/list_driver 是一个图片资源
ListView拖动时背景黑色的问题
我们知道在Android中ListView是一个比较常用的UI控件,我们在大部分开发中都需要用到它,因此Android为我们提供了 ListView的多种实现方法,通过自定义显示布局让显示的内容更加美观,但是我们会发现这样一个问题,当我们操作ListView的时候,如果不使用手机上下按键的时候,直接用触摸拖动视图的方式,会发现ListView的背景一片黑色,而且所有被选中的文字都变成一片漆黑。
其实这个问题发生的原因在于ListView存在缓存颜色机制,因此我们可以通过设定缓存颜色为透明的方法来解决这个问题。ATAAW.COM提供两个解决方法供大家使用,如下所示:
A、通过布局属性来设定(ListView的属性中直接定义)
android:cacheColorHint=”#00000000″
B、在代码中直接设定
listView.setCacheColorHint(Color.TRANSPARENT);
这样就可以解决黑色出现的问题了。
ListView 中添加按钮,动态删除添加ItemView的操作
要实现添加按钮的操作,必须自定义Adapter,使用Button View的setTag()方法,将Button所属的位置设置到tag当中
要实现动态添加删除ItemView的操作,必须首先调整调整Adapter所绑定的数据源,然后调用Adapter的notifyDataSetChanged()方法
以下为实现的一个实例
- packagecom.jason.joysmsyd;
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importjava.util.List;
- importjava.util.Map;
- importandroid.app.ListActivity;
- importandroid.content.Intent;
- importandroid.os.Bundle;
- importandroid.view.LayoutInflater;
- importandroid.view.View;
- importandroid.view.ViewGroup;
- importandroid.view.Window;
- importandroid.view.View.OnClickListener;
- importandroid.widget.BaseAdapter;
- importandroid.widget.Button;
- importandroid.widget.EditText;
- importandroid.widget.TextView;
- publicclassSendMainextendsListActivityimplementsOnClickListener{
- ButtonbuttonMessage,buttonContact,buttonHistory;
- EditTexttextMessage;
- List<Map<String,String>>contacts=newArrayList<Map<String,String>>();
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- //TODOAuto-generatedmethodstub
- super.onCreate(savedInstanceState);
- this.requestWindowFeature(Window.FEATURE_NO_TITLE);
- this.setContentView(R.layout.layout_send);
- buttonMessage=(Button)this.findViewById(R.id.ButtonMessage);
- buttonContact=(Button)this.findViewById(R.id.ButtonContact);
- buttonHistory=(Button)this.findViewById(R.id.ButtonHistory);
- textMessage=(EditText)this.findViewById(R.id.EditTextMessage);
- textMessage.setText(this.getIntent().getExtras().getString("message"));
- }
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- switch(v.getId()){
- caseR.id.ButtonMessage:
- this.finish();
- break;
- caseR.id.ButtonContact:
- {
- Intentintent=newIntent();
- intent.setAction("com.jason.action.contact");
- this.startActivityForResult(intent,0);
- }
- break;
- caseR.id.ButtonHistory:
- {
- Intentintent=newIntent();
- intent.setAction("com.jason.action.history");
- this.startActivityForResult(intent,1);
- }
- break;
- }
- }
- protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
- //TODOAuto-generatedmethodstub
- super.onActivityResult(requestCode,resultCode,data);
- if(requestCode==0&&resultCode==RESULT_OK){
- this.getcontactFromString(data.getExtras().getString(
- UserSelectActivity.RETURN_LIST));
- bindDataToList();
- }
- }
- privatevoidgetcontactFromString(Stringdata){
- if(data==null||data.length()==0){
- return;
- }
- String[]arrayContact=data.split("#");
- for(StringsingleContact:arrayContact){
- if(singleContact!=null&&singleContact.length()>0){
- String[]props=singleContact.split(":");
- if(props.length==2){
- Map<String,String>contact=newHashMap<String,String>();
- contact.put("name",props[0]);
- contact.put("phone",props[1]);
- contacts.add(contact);
- }
- }
- }
- }
- privatevoidbindDataToList(){
- this.setListAdapter(newMyAdapter());
- }
- publicclassMyAdapterextendsBaseAdapter{
- publicintgetCount(){
- //TODOAuto-generatedmethodstub
- returncontacts.size();
- }
- publicObjectgetItem(intposition){
- //TODOAuto-generatedmethodstub
- returncontacts.get(position);
- }
- publiclonggetItemId(intposition){
- //TODOAuto-generatedmethodstub
- returnposition;
- }
- publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- //TODOAuto-generatedmethodstub
- LayoutInflaterinflater=SendMain.this.getLayoutInflater();
- finalViewview=inflater.inflate(R.layout.layout_user_item,null);
- finalTextViewtextPhone=(TextView)view.findViewById(R.id.text1);
- finalTextViewtextName=(TextView)view.findViewById(R.id.text2);
- Buttonbutton=(Button)view.findViewById(R.id.buttonDelete);
- textPhone.setText(contacts.get(position).get("phone"));
- textName.setText(contacts.get(position).get("name"));
- button.setTag(position);
- button.setOnClickListener(newOnClickListener(){
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- intposition=Integer.parseInt(v.getTag().toString());
- contacts.remove(position);
- MyAdapter.this.notifyDataSetChanged();
- //SendMain.this.getListView().refreshDrawableState();
- }});
- returnview;
- }
- }
- }
Android ListView 清单与其Trigger 触发事件
Android ListView 清单与其选择时的触发事件,
可以参考下面的程式范例 :
- publicclasshelloWorldextendsActivity{
- String[]vData=null;
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- //要做为ArrayAdapter的资料来源
- vData=newString[]{"足球","棒球","篮球"};
- //建立"阵列接收器"
- ArrayAdapter<String>arrayData=newArrayAdapter<String>(
- this
- ,android.R.layout.simple_list_item_1
- ,vData
- );
- //建立ListView物件
- ListViewlv=newListView(this);
- //设定ListView的接收器,做为选项的来源
- lv.setAdapter(arrayData);
- //ListView设定Trigger
- lv.setOnItemClickListener(newOnItemClickListener(){
- publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,
- longarg3){
- //TODOAuto-generatedmethodstub
- setTitle(getResources().getString(R.string.app_name)+":"+vData[arg2]);
- }
- });
- //设定ListView为ContentView
- setContentView(lv);
- }
- }
Android中的ListView内容刷新问题
最近在学习Android的listView控件时遇到了一个问题,如何添加一个Item到ListView中并及时的刷新出来。在网上查了很多帖子,很多人在问,也很多人在解答,但是总的来说都没找到详细的解决方案。对于ListView与数据库的同步,高手们建议使用 ContentProvider对象。但是如果我不使用数据库呢?也有人回答用notifyDataSetChanged()方法。这倒是一个正确的解决方案,但是对于新手来说,还是比较困惑怎么去用,这里我贴一下我的用法:
- OnClickListenerlistener2=newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- Map<String,Object>m=newHashMap<String,Object>();
- StringtiString=tv.getText().toString();//注意这里我为什么要取出这个EditText的内容
- m.put("prod_na",tiString);//而不这样写m.put("prod_na",tv.getText());
- m.put("prod_type",tiString);//因为tv.getText()返回的是Editable对象,真正的数据是被缓存的,
- //也就是说你后续的EditText改动都会影响之前添加的Item
- coll.add(m);
- //取回Adapter对象,用于调用notifyDataSetChanged方法。
- SimpleAdaptersAdapter=(SimpleAdapter)lv.getAdapter();
- sAdapter.notifyDataSetChanged();
- }
- };
这里涉及到了Android中的MVC模式概念,如何存储数据,控制和显示。
你可以认为ListView是一个View,那么mode是什么呢?显然是SimpleAdapter对象,而Control又是什么呢?那只能是notifyDataSetChanged()了。当数据变化时,也就是SimpleAdapter所处理的数据变化了,那么我们就需要调用 notifyDataSetChanged 去通知View作出改变。
版权声明:本文为博主原创文章,未经博主允许不得转载。
更多相关文章
- 时间轴控件TimeLineView的实现
- Android+Jquery Mobile学习系列(5)-SQLite数据库
- 【Mark 】AndroidStudio_移动应用开发
- android监听键盘
- Android(安卓)Activity 详解
- Android开发艺术探索知识回顾——第2章 IPC机制:1、IPC 的基础知
- Android(安卓)Dagger2 初学笔记
- Android菜单Menu的创建
- ImageView通过matrix实现手势缩放