這是Android的ListView適配器的一種正常的行爲,它的getView()呼籲每一個滾動和每一個新的列表項調用它getView,如果當前列表視圖項在UI上不可見,那麼它的convertView等於null:在某個時間,listview只加載可見列表項,如果它每次顯示50個元素中的10個元素,那麼listView.getChildCount()將只返回10個而不是50個。 在你選擇5時,它反映了5 + 10(可見項數)= 15,25,35,45的選擇。 爲了解決這個問題,你應該有一個標誌與你的每個listItem數據關聯,例如,如果你有字符串數組itemData [50]作爲數組,然後採用布爾isSelected [50]的數組,每個初始值爲false。
看一看的getView(),在適配器類:
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
string text = itemData[position]
if (convertView == null) {
rowLayout = (RelativeLayout) LayoutInflater.from(context)
.inflate(R.layout.list_view_item, parent, false);
holder = new ViewHolder();
holder.txtString= (TextView) rowLayout
.findViewById(R.id.txtTitle);
rowLayout.setTag(holder);
} else {
rowLayout = (RelativeLayout) convertView;
holder = (ViewHolder) rowLayout.getTag();
}
if(isSelected[position] == true){
holder.txtString.setText("Selected")
rowLayout.setBackGround(selected)
}else{
holder.txtString.setText("Not Selected")
rowLayout.setBackGround(notSelected)
}
public class ViewHolder {
public TextView txtString;
}
,並在listView.setOnItemClickListener()你的Activity類:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long arg3) {
// TODO Auto-generated method stub
isSelected[position] = true // on selection
RelativeLayout rowLayout = (RelativeLayout) view;
rowLayout.setBackGround(Selected);
// also set here background selected for view by getting layout refference
}
});
您的convertView重新使用?因爲它聽起來像背景已經設置好,而且在重新使用時不會重置它。 – Blundell 2012-02-08 14:47:22
同意@Blundell,你應該發佈你的適配器代碼。 – dmon 2012-02-08 14:56:55