2013-01-18 46 views
0

我有一個ListView,它應該成爲一個菜單,每行有兩個可繪製和兩個文本視圖。使用適配器設置列表視圖高度而不使用TextView

活動代碼:

ArrayList<MenuItem> itemArray = new ArrayList<MenuItem>(); 
     itemArray.add(new MenuItem("Headertexxt", "subbtexdt")); 
     itemArray.add(new MenuItem("asf", "asf")); 

     ListView listView = (ListView) findViewById(R.id.listViewCM); 

     String[] array = getResources().getStringArray(R.array.buttonsCM); 
     int[] images = new int[] { R.drawable.btn_car, R.drawable.btn_star, R.drawable.btn_bag}; 
     listView.setAdapter(new HomeScreenButtonsAdapterSubtext(this, R.layout.row, 
       itemArray, images, R.drawable.list_arrow)); 

     Utils.setListViewHeightBasedOnChildren(listView); 
     listView.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       switch (position) { 
       case 0: 
        findViewById(R.id.buttonCreditCompilation).performClick(); 
        break; 
       case 1: 
        findViewById(R.id.buttonYourCredits).performClick(); 
        break; 

       } 
      } 
     }); 

適配器代碼:

public class HomeScreenButtonsAdapterSubtext extends ArrayAdapter<MenuItem> { 

     private Drawable[] drawables; 

     private Drawable arrowDrawable; 
     private ArrayList<MenuItem> items; 

     public HomeScreenButtonsAdapterSubtext(Context context, int resourceId, 
       ArrayList<MenuItem> items, int[] images, int arrowImage) { 
      super(context, resourceId, items); 
      this.items = items; 

      Resources resources = context.getResources(); 
      if (images != null) { 
       drawables = new Drawable[images.length]; 
       int i = 0; 
       for (int id : images) { 
        Drawable drawable = resources.getDrawable(id); 
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), 
          drawable.getIntrinsicHeight()); 
        drawables[i++] = drawable; 
       } 
      } 

      arrowDrawable = resources.getDrawable(arrowImage); 
      arrowDrawable.setBounds(0, 0, arrowDrawable.getIntrinsicWidth(), 
        arrowDrawable.getIntrinsicHeight()); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View v = super.getView(position, convertView, parent); 
      if (v instanceof TextView) { 
      Drawable dr = drawables != null ? drawables[position % 
      drawables.length] : null; 
      ((TextView) v).setCompoundDrawables(dr, null, arrowDrawable, null); 
      Utils.setFont((TextView) v); 
      } 

//   View v = convertView; 
      if (v == null) { 
       LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v = vi.inflate(R.layout.row, null); 
      } 

      MenuItem station = items.get(position); 
      if (station != null) { 
       TextView tt = (TextView) v.findViewById(R.id.headerText); 
       TextView bt = (TextView) v.findViewById(R.id.subText); 


       if (tt != null) { 
        tt.setText(station.getHeaderText()); 
       } 
       if (bt != null) { 
        bt.setText(station.getSubText()); 
       } 

      } 

      return v; 
     } 

我現在的問題是,我不能設置listview height基於孩子。我試圖在此處執行此操作:Utils.setListViewHeightBasedOnChildren(listView);但在此行發生錯誤:arrayadapter requires the resource id to be a textview。有沒有人知道這個解決方案?

我可以使用其他方法設定ListView高度嗎?

感謝

回答

1

but getting the error: arrayadapter requires the resource id to be a textview at this row.

R.layout.row是它不具有隻是一個TextView佈局文件。如果您調用您使用的超級構造函數,並且您還在適配器中調用super.getView(在getView方法中)方法,則ArrayAdapter會抱怨,因爲它期望傳遞給它的佈局文件中的單個小部件(單個TextView)。

我不明白你爲什麼在getView方法中(通過超級調用)擁有那段代碼,當你確切知道該行不能是Textview的實例時。

我不知道如何設置ListView的高度,如果您要顯示ListView的所有行,請不要這樣做(因爲您的ListView基本上沒用)。如果您仍想這樣做,那麼最好丟掉ListView並手動構建行佈局。

+0

這個答案有效,但我從中得到了很多幫助,並從這個http://stackoverflow.com/a/11967081/1436948獲得了很多幫助 – PaperThick

1

事實上它並沒有真正意義的設置ListView取決於其內容的高度。

因爲ListView的整點是讓它的內容可以滾動(不管它有多大)......所以它應該有一個固定的高度。

相關問題