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