需要說明的是,在正常默認情況下都是選擇Item橙黃色,點擊Item橙黃色,但是如果你設置了Item整體布局的背景色 android:background="#000000"則,你的上面兩個都會不起作用,導致你selected了Item看不出來是否選擇了。
那如何改橙黃色為綠色呢?????
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. 在程序中:
- Drawable drawable=getResources().getDrawable(R.drawable.touch_feedback);
- ListView.setSelector(drawable);
2. 在xml里面的ListView標簽下添加:
記錄和恢復ListView滾動的位置
有時候我們需要記錄當前ListView滾動到的位置,重新加載的時候要回到原位,不羅嗦,給出代碼:
- //列表滾動
- private OnScrollListener ScrollLis = new OnScrollListener() {
- @Override
- public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
- }
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- if(scrollState==OnScrollListener.SCROLL_STATE_IDLE){
- ListPos=list.getFirstVisiblePosition(); //ListPos記錄當前可見的List頂端的一行的位置
- }
- }
- };
接下來就是還原位置,放在ListView加載之后:
關於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()方法
以下為實現的一個實例
- package com.jason.joysmsyd;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.ListActivity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.view.Window;
- import android.view.View.OnClickListener;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.TextView;
- public class SendMain extends ListActivity implements OnClickListener{
- Button buttonMessage,buttonContact,buttonHistory;
- EditText textMessage;
- List<Map<String,String>> contacts = new ArrayList<Map<String,String>>();
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- 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"));
- }
- public void onClick(View v) {
- // TODO Auto-generated method stub
- switch(v.getId()){
- case R.id.ButtonMessage:
- this.finish();
- break;
- case R.id.ButtonContact:
- {
- Intent intent = new Intent();
- intent.setAction("com.jason.action.contact");
- this.startActivityForResult(intent, 0);
- }
- break;
- case R.id.ButtonHistory:
- {
- Intent intent = new Intent();
- intent.setAction("com.jason.action.history");
- this.startActivityForResult(intent, 1);
- }
- break;
- }
- }
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // TODO Auto-generated method stub
- super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == 0 && resultCode == RESULT_OK) {
- this.getcontactFromString(data.getExtras().getString(
- UserSelectActivity.RETURN_LIST));
- bindDataToList();
- }
- }
- private void getcontactFromString(String data) {
- if (data == null || data.length() == 0) {
- return;
- }
- String[] arrayContact = data.split("#");
- for (String singleContact : arrayContact) {
- if (singleContact != null && singleContact.length() > 0) {
- String[] props = singleContact.split(":");
- if (props.length == 2) {
- Map<String,String> contact = new HashMap<String,String>();
- contact.put("name", props[0]);
- contact.put("phone", props[1]);
- contacts.add(contact);
- }
- }
- }
- }
- private void bindDataToList(){
- this.setListAdapter(new MyAdapter());
- }
- public class MyAdapter extends BaseAdapter{
- public int getCount() {
- // TODO Auto-generated method stub
- return contacts.size();
- }
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- return contacts.get(position);
- }
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return position;
- }
- public View getView(int position, View convertView, ViewGroup parent) {
- // TODO Auto-generated method stub
- LayoutInflater inflater = SendMain.this.getLayoutInflater();
- final View view = inflater.inflate(R.layout.layout_user_item, null);
- final TextView textPhone = (TextView) view.findViewById(R.id.text1);
- final TextView textName = (TextView) view.findViewById(R.id.text2);
- Button button = (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(new OnClickListener(){
- public void onClick(View v) {
- // TODO Auto-generated method stub
- int position = Integer.parseInt(v.getTag().toString());
- contacts.remove(position);
- MyAdapter.this.notifyDataSetChanged();
- // SendMain.this.getListView().refreshDrawableState();
- }});
- return view;
- }
- }
- }
Android ListView 清單與其Trigger 觸發事件
Android ListView 清單與其選擇時的觸發事件,
可以參考下面的程式范例 :
- public class helloWorld extends Activity {
- String[] vData = null;
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 要做為ArrayAdapter的資料來源
- vData = new String[]{"足球","棒球","籃球"};
- // 建立"陣列接收器"
- ArrayAdapter<String> arrayData = new ArrayAdapter<String>(
- this
- , android.R.layout.simple_list_item_1
- , vData
- );
- // 建立ListView 物件
- ListView lv = new ListView(this);
- // 設定ListView 的接收器, 做為選項的來源
- lv . setAdapter ( arrayData );
- // ListView 設定Trigger
- lv . setOnItemClickListener ( new OnItemClickListener() {
- public void onItemClick (AdapterView<?> arg0, View arg1, int arg2,
- long arg3) {
- // TODO Auto-generated method stub
- setTitle( getResources().getString(R.string.app_name) + ": " + vData [ arg2 ]);
- }
- });
- // 設定ListView 為ContentView
- setContentView(lv);
- }
- }
Android中的ListView內容刷新問題
最近在學習Android的listView控件時遇到了一個問題,如何添加一個Item到ListView中並及時的刷新出來。在網上查了很多帖子,很多人在問,也很多人在解答,但是總的來說都沒找到詳細的解決方案。對於ListView與數據庫的同步,高手們建議使用 ContentProvider對象。但是如果我不使用數據庫呢?也有人回答用notifyDataSetChanged()方法。這倒是一個正確的解決方案,但是對於新手來說,還是比較困惑怎么去用,這里我貼一下我的用法:
- OnClickListener listener2 = new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Map<String, Object> m = new HashMap<String, Object>();
- String tiString = 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方法。
- SimpleAdapter sAdapter = (SimpleAdapter)lv.getAdapter();
- sAdapter.notifyDataSetChanged();
- }
- };
這里涉及到了Android中的MVC模式概念,如何存儲數據,控制和顯示。
你可以認為ListView是一個View,那么mode是什么呢?顯然是SimpleAdapter對象,而Control又是什么呢?那只能是notifyDataSetChanged()了。當數據變化時,也就是SimpleAdapter所處理的數據變化了,那么我們就需要調用 notifyDataSetChanged 去通知View作出改變。