簡體   English   中英

ListView項目背景顏色更新

[英]ListView item background color update

我創建了具有動態項目的listview,其中包含兩個項目:CheckBox和TextView。 當用戶點擊項目內的復選框時,它將更新textView的背景顏色。 在此項目滾動到列表的用戶空間的不可見位置之前,它正常工作,並且出現錯誤:com.viewactivities.AddNewPosition.changeTextColorWhenCheckBoxIsClicked(AddNewPosition.java:183)上的java.lang.NullPointerException。

我還用一種負責更改顏色的方法實現了接口。 我觀察到,當listView中的項目不再可見時,也會觸發方法“ changeTextColorWhenCheckBoxIsClicked”(這會導致錯誤)。 有人可以幫忙嗎?

包含列表視圖和更改顏色的方法的類代碼:

@Override
public void changeTextColorWhenCheckBoxIsClicked(int position) {
    // TODO Auto-generated method stub

    listView.getChildAt(position).findViewById(R.id.listViewItemText).setBackgroundColor(Color.BLUE);

}

以及來自listView適配器的代碼:

@Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
          ViewHolder viewHolder = null;
          globalPosition = position;

        if(convertView==null){

             LayoutInflater inflater =  ((AddNewPosition) mContext).getLayoutInflater();    
             convertView = inflater.inflate(layoutResourceId, parent, false);

             viewHolder = new ViewHolder();
                viewHolder.text = (TextView) convertView.findViewById(R.id.listViewItemText);
                viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.listViewItemCheckBox);

                viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {


                        int getPosition = (Integer) buttonView.getTag();  // Here we get the position that we have set for the checkbox using setTag.
                        listOfObjects.get(getPosition).setCheckBoxEnabled(buttonView.isChecked()); // Set the value of checkbox to maintain its state.   changeTextColorWhenCheckBoxIsClicked(getPosition);
                    }
                });
                convertView.setTag(viewHolder);
                convertView.setTag(R.id.listViewItemText, viewHolder.text);
                convertView.setTag(R.id.listViewItemCheckBox, viewHolder.checkbox);
                } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.checkbox.setTag(position); // This line is important.

            viewHolder.text.setText(listOfObjects.get(position).getTextFromListViewItemObject());
            viewHolder.checkbox.setChecked(listOfObjects.get(position).getIsCheckedBoxEnabled());
            //viewHolder.text.setBackgroundColor(Color.RED);

        //ListViewItemObject tmpObject = listOfObjects.get(position);

        //TextView listItemText = (TextView) convertView.findViewById(R.id.listViewItemText);
        //CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.listViewItemCheckBox);
        //checkBox.setChecked(false);

        //listItemText.setText(tmpObject.getTextFromListViewItemObject());

         return convertView;
    }


    @Override
    public void changeTextColorWhenCheckBoxIsClicked(int position) {
        // TODO Auto-generated method stub

        ((AddNewPosition) mContext).changeTextColorWhenCheckBoxIsClicked(position);

    }

ListView重用了它的視圖,因此與其使用setTag()而不是使用列表來保持位置。

viewHolder.checkbox.setTag(position); // This line is important.

像這樣- 行元素的Android Listview滾動挑戰

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM