1. 程式人生 > >Android ListView點選之後保持更換的背景色,實現已讀功能

Android ListView點選之後保持更換的背景色,實現已讀功能

        因為專案中有這樣的需求:一般訊息類或者資訊類的介面,都有類似於網易客戶端的點選之後更換背景色,並且保持這個顏色,表示已讀取該條資訊。這個功能一開始覺得已經實現了,在我的另一篇部落格上有:點選開啟連結 後來測試人員在測試的時候,發現這樣一個奇怪的問題:

       當點選了listview的第0項,背景顏色改變,並且保持著背景沒錯,但滑動到下一個頁面的listview,原本沒有點選的item,竟然莫名其妙的出現了更換的背景。。。

      出現上述的情況是因為我實現的原理是這樣的:當用戶點選某一個item,會進入到監聽方法裡面,我設定一個變數儲存所選中的位置position,也就是如下程式碼:

	 arg1.setSelected(true);
				selectItem = arg2; // 當前選擇的節目item
				
				messageAd.notifyDataSetChanged(); // 通知adapter重新整理資料

     在介面卡裡面,我就使用if語句判斷,如果position等於剛才所點選的item,則設定背景顏色,如下程式碼:
if (selectItem == position) {
			//設定背景
			// }

      上述設定就會出現錯亂的問題,原因以後再深究,下面貼出解決的辦法,不多說直接上程式碼,有註釋:
package com.explink.listview;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;

public class MainActivity extends Activity {
	private ListView mListView;
	private MyAdapter mAdapter;
	List<User> userList;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
		initData();
	}
	private void initView() {
		mListView = (ListView) findViewById(R.id.mListView);
	}
	private void initData() {
		User user = new User("盧磊", "13319405061");
		User user1 = new User("小明", "13319405062");
		User user2 = new User("小黃", "13319405063");
		User user3 = new User("小綠", "13319405064");
		User user4 = new User("盧磊", "13319405061");
		User user5 = new User("小明", "13319405062");
		User user6 = new User("小黃", "13319405063");
		User user7 = new User("小綠", "13319405064");
		User user8 = new User("盧磊", "13319405061");
		User user9 = new User("小明", "13319405062");
		User user10 = new User("小黃", "13319405063");
		User user11 = new User("小綠", "13319405064");
		User user12 = new User("盧磊", "13319405061");
		User user13 = new User("小明", "13319405062");
		User user14 = new User("小黃", "13319405063");
		User user15 = new User("小綠", "13319405064");
		User user16 = new User("盧磊", "13319405061");
		User user17 = new User("小明", "13319405062");
		User user18 = new User("小黃", "13319405063");
		User user19 = new User("小綠", "13319405064");
		User user20 = new User("盧磊", "13319405061");
		User user21 = new User("小明", "13319405062");
		User user22 = new User("小黃", "13319405063");
		User user23 = new User("小綠", "13319405064");
		// 一般從網路上獲取的資料都是List集合
		userList = new ArrayList<User>();
		userList.add(user);
		userList.add(user1);
		userList.add(user2);
		userList.add(user3);
		userList.add(user4);
		userList.add(user5);
		userList.add(user6);
		userList.add(user7);
		userList.add(user8);
		userList.add(user9);
		userList.add(user10);
		userList.add(user11);
		userList.add(user12);
		userList.add(user13);
		userList.add(user14);
		userList.add(user15);
		userList.add(user16);
		userList.add(user17);
		userList.add(user18);
		userList.add(user19);
		userList.add(user20);
		userList.add(user21);
		userList.add(user22);
		userList.add(user23);

		mAdapter = new MyAdapter(MainActivity.this, userList);
		mListView.setAdapter(mAdapter);
		mListView.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				mAdapter.recordPosition(arg2);
				mAdapter.notifyDataSetChanged();
			}
		});
	}
	@SuppressLint("UseSparseArrays")
	public class MyAdapter extends BaseAdapter {
		private LayoutInflater inflater;
		private List<User> userList;
		private List<Integer> pList = new ArrayList<Integer>();
		public MyAdapter(Context context, List<User> userList) {
			this.inflater = LayoutInflater.from(context);
			this.userList = userList;
		}
		@Override
		public int getCount() {
			return this.userList.size();
		}

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

		@Override
		public long getItemId(int position) {
			return position;
		}
		public void recordPosition(int position) {
			pList.add(position);
		}
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder;
			if (convertView == null) {
				convertView = inflater.inflate(R.layout.list_item, null);
				holder = new ViewHolder();
				holder.name_tv = (TextView) convertView
						.findViewById(R.id.name_tv);
				holder.phone_tv = (TextView) convertView
						.findViewById(R.id.phone_tv);
				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
			}
			holder.name_tv.setText(userList.get(position).getName());
			holder.phone_tv.setText(userList.get(position).getPhoneNo());
			//防止convertView複用背景,導致第二頁出現灰色背景,所以在判斷設定為白色
			convertView.setBackgroundColor(Color.WHITE);
			for (int i = 0; i < pList.size(); i++) {
				if (pList.get(i) == position) {
					convertView.setBackgroundColor(Color.GRAY);
				}
			}
			return convertView;
		}
		public class ViewHolder {
			public TextView name_tv;
			public TextView phone_tv;
		}
	}
}
      資料來源的類為:
package com.explink.listview;

public class User {
	public User(){
	}
	public User(String name,String phoneNo){
		this.name = name;
		this.phoneNo = phoneNo;
	}
	private String name;
	private String phoneNo;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPhoneNo() {
		return phoneNo;
	}
	public void setPhoneNo(String phoneNo) {
		this.phoneNo = phoneNo;
	}
	
}

           資源已經上傳到csdn,傳送門在此:android listview已讀功能  ,上一篇的部落格如果有需要檢視的,可以參考如下連結:android listview保持背景顏色