<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 2.4.8 ListView之checkbox錯位問題解決 ## 本節引言: > 作為ListView經典問題之一,如果你嘗試過自定義ListView的item,在上面帶有一個checkbox的話,那么 當你的item數超過了一頁的話,就會出現這個問題,下面我們來分析下出現這種問題的原因,以及如何來 解決這個問題! ## 1.問題發生的原因: 這是網上找來的一幅關于ListView getView方法調用機制的一個圖 ![](http://www.runoob.com/wp-content/uploads/2015/09/23101560K-0.jpg) 上圖中有一個**Recycler**的東東,平時我們ListView上可見的Item處于內存中,而且他的Item則放在 這個Recycler中,第一次加載item時,當前頁面中的convertView都為NULL,當滾出屏幕,這是時候 **ConvertView**不為空,所以新的一項會復用這個ConvertView! 我們可以寫個簡單的例子,跟下log,下面是運行后的一些Log圖! ![](http://www.runoob.com/wp-content/uploads/2015/09/64217183.jpg) 從圖中看出,Postion從12開始,ConvertView就不為空了,具體這里代表的是什么, 我也不知道,目測要走源碼...我們知道這里ConvertView會緩存就好,就是因為這個原因 造成的checkbox錯位,所以第一個解決方式就是,不重用這個ConvertView,或者 說每次getView都將這個ConvertView設置為null,但是如果需要顯示的Item數目巨大的話, 這種方法就會顯得非常臃腫,一般實際開發我們使用的是下面的解決方法: **找個東東來保存當前Item CheckBox的狀態,初始化的時候進行判斷,設置是否選中!** ## 2.解決方法示例: > 好的存儲這個Checkbox的方法有很多,你可以放到一個HashMap&lt;Integer, Boolean&gt;中, 每次初始化的時候根據postion取出對應的boolean值,然后再進行checkbox的狀態設置; 而筆者的做法則是在entity類中加入了一個boolean值用于判斷,下面是筆者一個項目中 抽取出來的代碼,代碼比較簡單,相信你看完會秒懂的~ Entity類:**Person.java**: ``` public class Person implements Serializable{ private String name; private String number; private boolean checkStatus; public Person(String name, String number) { super(); this.name = name; this.number = number; this.checkStatus = false; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public boolean getCheckStatus() { return checkStatus; } public void setCheckStatus(boolean checkStatus) { this.checkStatus = checkStatus; } } ``` 實現的Adapter類:**ContactListAdapter.java**:**** **** ``` public class ContactListAdapter extends BaseAdapter implements CompoundButton.OnCheckedChangeListener{ private List<Person> mData; private Context mContext; public ContactListAdapter(List<Person> data, Context context) { mData = data; mContext = context; } // 定義一個刷新數據的方法 public void changeData(List<Person> data) { mData = data; notifyDataSetChanged(); } @Override public int getCount() { return mData.size(); } @Override public Person getItem(int position) { return mData.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { final int index = position; ViewHolder viewHolder; if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate( R.layout.item_contact, parent, false); viewHolder = new ViewHolder(); viewHolder.ly = (RelativeLayout) convertView .findViewById(R.id.lyContactListItem); viewHolder.txtName = (TextView) convertView .findViewById(R.id.txtName); viewHolder.txtNumber = (TextView) convertView .findViewById(R.id.txtNumber); viewHolder.cbxStatus = (CheckBox) convertView .findViewById(R.id.cbxStatus); convertView.setTag(viewHolder); viewHolder.cbxStatus.setTag(index); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.cbxStatus.setOnCheckedChangeListener(this); viewHolder.cbxStatus.setChecked(mData.get(position).getcheckStatus()); viewHolder.txtName.setText(mData.get(index).getName()); viewHolder.txtNumber.setText(mData.get(index).getNumber()); return convertView; } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { int index = (int)buttonView.getTag(); if (isChecked) mData.get(index).setCheckStatus(true); else mData.get(index).setCheckStatus(false); } private class ViewHolder { RelativeLayout ly; TextView txtName; TextView txtNumber; CheckBox cbxStatus; } } ``` 嘿嘿,非常簡單,另外別忘了一點: **checkbox監聽器的方法要添加在初始化Checkbox狀態的代碼之前哦~** ## 本節引言: > 好的,本節給大家講解了ListView的一個經典問題,ListView中checkbox錯位的 問題解決,只需簡單的添加一個記錄checkbox選擇狀態的值,然后重寫checkbox 點擊事件的時候,先做判斷~謝謝~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看