2010-11-24 7 views
4

これで、listViewの属性layout_widthに問題が発生しました。ListViewのLayout_width

私のプロジェクトでは、画面の幅に合わないリストビューの背景画像がありました。だから、layout_widthをwrap_contentに設定し、listViewを水平に中心に置いた。

アダプタでGetViewメソッドが表示されたセルの数の3倍を超えて呼び出されたため、これは悪い考えでした。 fill_parentにlayout_widthを設定すると、問題は解決されます。問題を示す簡単なプロジェクトを作成しました。ここで

は、活動のxmlです:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 
<ListView 
    android:id="@android:id/list" 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
/> 
</RelativeLayout> 

item_listのxml:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp" 
    android:textSize="16sp" > 
</TextView> 

そして最後の活動:

package fr.example.android.listviewbug; 

import android.app.ListActivity; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 

public class ExampleListViewBugActivity extends ListActivity{ 
    public static int cpt; 

    public static final String[] COUNTRIES = new String[] { 
     "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", 
     "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina", 
     "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan", 
     "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", 
     "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia", 
     "Bosnia and Herzegovina", "Botswana", "Bouvet Island", "Brazil", "British Indian Ocean Territory", 
     "British Virgin Islands", "Brunei", "Bulgaria", "Burkina Faso", "Burundi", 
     "Cote d'Ivoire", "Cambodia", "Cameroon", "Canada", "Cape Verde", 
     "Cayman Islands", "Central African Republic", "Chad", "Chile"}; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     cpt = 0; 
     setListAdapter(new CustomArrayAdapter(this, R.layout.list_item, COUNTRIES)); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.d("AdapterTest", "onDestroy()"); 
    } 

    private class CustomArrayAdapter extends ArrayAdapter<String>{ 
     public CustomArrayAdapter(Context context, int textViewResourceId, String[] countries) { 
      super(context, textViewResourceId, countries); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      Log.d("AdapterTest", " cpt:"+ ++cpt); 
      return super.getView(position, convertView, parent); 
     } 
} 
} 

だから私の解決策は単純に設定することですfill_parentにlayout_widthを設定し、リストビューの背景画像を修正して透明な枠線を追加します画面サイズ。

しかし、それは既知の問題だ場合、私は、この問題は、リストビューにwrap_contentで表示される理由を知りたいのですが、なぜそれがドキュメントではありません...

答えて

19

幅を "wrap_content"に設定すると、ListViewの幅がその子の幅と同じになるように指定できます。したがって、ListViewはアイテムを測定し、アダプタ上でgetView()を呼び出さなければならないアイテムを取得する必要があります。これは、レイアウトパスの数、親レイアウトの動作などによって数回発生する可能性があります。

getView()がアダプタで呼び出された回数、コールが発生します。したがって、できるだけ効率的になるようにgetView()を実装する必要があります。要するに、これは問題ではなく、この状況で期待される動作です。

+2

あなたはリストビューロマインの父です。 – Prateek

+1

これは重要です、私はLINTはこれについて警告するべきだと思います – dors

9

答えは簡単です:あなたは、レイアウトを設定した場合あなたのListViewwrap_contentの幅またはレイアウトの高さは、リストビューがに添付されているすべてのものを測定しようとします。これは間違いなくあなたが望むものではありません。

一般的に、ListViewまたはGridViewには常にwrap_contentを設定しないでください。

+0

ListViewに2つのアイテムしか含まれていない場合は、幅を測定するのには非常に便利ですが、ListViewには表示されません。したがって、問題はwrap_contentではなくListViewにあります。 – CoolMind