android listview addHeaderViewとaddFooterViewの注意事項

2420 ワード


今日はプロジェクトをするときにカスタムlistviewとカスタムitem、adapterを使いました.注意すべき点を記録します.
1、item内にbuttonなどのコントロールがある場合、listviewのonitemclickイベントを傍受すると、item内のbutton、imagebuttonなどのコントロールにフォーカスが奪われ、listviewにonitemclickイベントが設定された後にトリガーされない.解決策は、itemを初期化するときに内部buttonなどのコントロールの焦点取得を遮断することです.具体的な方法は、カスタムitemのルートコントロールで呼び出すことができます.
setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);   

 
 
 
これによりワードコントロールが焦点を奪うのをブロックし、listviewのonitemclickが正しくトリガーされ、item内部のbuttonなどのコントロールにも影響を与えず、クリックされたときも自分のクリックイベントをトリガーすることができます.
 
2.listviewにheaderviewを追加する必要がある場合、listviewのaddHeaderView(headView,null,false)メソッドを呼び出すことができ、このメソッドにはaddHeaderView(headView)のリロードメソッドがある.この2つの方法の違いは、前の方法がheaderがselectedされるかどうかを制御することができ、selectedされたくない場合は3番目のパラメータをfalseに設定することである.
 
3.次に上記のヘッダを追加する、ヘッダを追加するときに呼び出されるaddHeaderViewメソッドはlistviewに置かなければならない.setadapterの前に、listviewにヘッダを追加するには、adapterをバインドする前に追加する必要があります.そうしないと、エラーが発生します.なぜなら、setAdapterメソッドを呼び出すとandroidは現在のlistviewにヘッダーが追加されているかどうかを判断し、追加されている場合は、設定したadapterのすべてのコンテンツとlistviewのヘッダーとfooterを含む新しいtempadapterが生成されます.だからlistviewにheaderを追加した後、プログラムでlistviewを呼び出します.getadapterでは、setadapterを介して渡されたadapterではなくtempadapterが返されます.adapterが設定されていない場合はtempadapterは私たち自身のadapterと同じです.listview.getadapter().getcount()メソッドの戻り値は、ヘッダが追加されたため、予想より大きくなります.
 
4、次に上のtempadapterによると、私たちがadapterをカスタマイズするgetitemメソッドで返されるpositionにはheaderは含まれていません.私たちがadapterをカスタマイズするデータposition番号は0から始まります.つまり、私たちが伝えたリストの位置と同じです.
@Override  

public View getView(int position, View convertView, ViewGroup parent) {  

// TODO Auto-generated method stub   

Log.i("adapter", "position:"+position);   // position    

  }  

 
listviewのonitemclickメソッドでは、
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) 

 
arg 2は現在のclickの位置であり、この位置はtempadapterの位置を指し、0からlistviewにheaderが追加された場合、0はheaderを表す.