2013-10-25 31 views
0

中的視圖元素和分隔符之間的垂直空間很大,是一個list_item佈局。我不明白爲什麼在列表項行內的viewtext elemens和divider元素之間有一個很大的垂直空間?這種佈局有什麼問題?對於列表項佈局問題,下面的列表項

Screenshot here

我的佈局XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    <TextView 
      android:id="@+id/companyName" 
      android:layout_width="fill_parent" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:textColor="@color/table_text_selector"/> 

    <TextView 
      android:id="@+id/exchange" 
      android:layout_width="fill_parent" 
      android:layout_height="match_parent" 
      android:textAppearance="?android:attr/textAppearanceSmall" 
      android:textColor="@color/table_text_light_selector" 
      android:layout_below="@id/companyName"/> 

    <TextView 
      android:id="@+id/symbol" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:textAppearance="?android:attr/textAppearanceSmall" 
      android:textColor="@color/table_text_light_selector" 
      android:layout_below="@id/companyName" 
      android:layout_toLeftOf="@id/exchange"/> 

    <TextView 
      android:id="@+id/price" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:singleLine="true" 
      android:ellipsize="end" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:textColor="@color/table_text_selector" 
      android:layout_alignParentRight="true"/> 

    <TextView 
      android:id="@+id/change" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:textAppearance="?android:attr/textAppearanceSmall" 
      android:textColor="@color/table_stock_change_text" 
      android:layout_alignParentRight="true" 
      android:layout_below="@id/price"/> 

    <TextView 
      android:id="@+id/percentChange" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:textAppearance="?android:attr/textAppearanceSmall" 
      android:textColor="@color/table_stock_change_text" 
      android:layout_alignBaseline="@id/change" 
      android:layout_alignBottom="@id/change" 
      android:layout_toLeftOf="@id/change" 
      android:layout_marginRight="5dp"/> 

</RelativeLayout> 

這是片段:

public class StockListFragment extends ItemListFragment<CurrentStock> { 

    @Inject BootstrapServiceProvider serviceProvider; 
    @Inject LogoutService logoutService; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Injector.inject(this); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     setEmptyText(R.string.no_stocks); 


    } 

    @Override 
    protected void configureList(Activity activity, ListView listView) { 
     super.configureList(activity, listView); 

     listView.setFastScrollEnabled(true); 
     listView.setDividerHeight(0); 

     getListAdapter().addHeader(activity.getLayoutInflater() 
         .inflate(R.layout.stock_list_item_labels, null)); 
    } 

    @Override 
    LogoutService getLogoutService() { 
     return logoutService; 
    } 


    @Override 
    public Loader<List<CurrentStock>> onCreateLoader(int id, Bundle args) { 
     final List<CurrentStock> initialItems = items; 
     return new ThrowableLoader<List<CurrentStock>>(getActivity(), items) { 
      @Override 
      public List<CurrentStock> loadData() throws Exception { 

       try { 
        List<CurrentStock> latest = null; 

        if(getActivity() != null) 
         latest = serviceProvider.getService(getActivity()).getStocks(); 

        if (latest != null) 
         return latest; 
        else 
         return Collections.emptyList(); 
       } catch (OperationCanceledException e) { 
        Activity activity = getActivity(); 
        if (activity != null) 
         activity.finish(); 
        return initialItems; 
       } 
      } 
     }; 

    } 

    public void onListItemClick(ListView l, View v, int position, long id) { 
     CurrentStock currentStock = ((CurrentStock) l.getItemAtPosition(position)); 

     startActivity(new Intent(getActivity(), StockActivity.class).putExtra(STOCK, currentStock)); 
    } 

    @Override 
    public void onLoadFinished(Loader<List<CurrentStock>> loader, List<CurrentStock> items) { 
     super.onLoadFinished(loader, items); 

    } 

    @Override 
    protected int getErrorMessage(Exception exception) { 
     return R.string.error_loading_stocks; 
    } 

    @Override 
    protected SingleTypeAdapter<CurrentStock> createAdapter(List<CurrentStock> items) { 
     return new StockListAdapter(getActivity().getLayoutInflater(), items); 
    } 
} 

這是適配器

public class StockListAdapter extends SingleTypeAdapter<CurrentStock> { 

    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("MMMM dd"); 

    /** 
    * Create adapter 
    * 
    * @param inflater 
    * @param items 
    */ 
    public StockListAdapter(LayoutInflater inflater, List<CurrentStock> items) { 
     super(inflater, R.layout.stock_list_item); 
     setItems(items); 
    } 

    /** 
    * Create adapter 
    * 
    * @param inflater 
    */ 
    public StockListAdapter(LayoutInflater inflater) { 
     this(inflater, null); 

    } 

    @Override 
    public long getItemId(final int position) { 
     final String id = getItem(position).getSymbol(); 
     return !TextUtils.isEmpty(id) ? id.hashCode() : super 
       .getItemId(position); 
    } 
/**/ 
    @Override 
    protected int[] getChildViewIds() { 
     return new int[] { R.id.companyName, R.id.exchange, R.id.symbol, R.id.price, R.id.change, R.id.percentChange }; 
    } 

    @Override 
    protected void update(int position, CurrentStock currentStock) { 
     setText(0, currentStock.getCompanyName()); 
     setText(1, currentStock.getExchange()); 
     setText(2, currentStock.getSymbol()); 
     setText(3, currentStock.getPrice().toString()); 
     setText(4, currentStock.getChange().toString()); 
     setText(5, currentStock.getPercentChange()); 
    } 


} 

我不有listview它selvf。順便說一句。除了頂部和底部的分頻器,我需要一個分頻器嗎?

+1

你可以發佈截圖嗎? –

+0

此代碼不包含任何分配器 –

+0

@DineshPrajapati:它是關於分配器列表...讓我們先看屏幕截圖 – gunar

回答

0

問題就出在你的代碼,您使用的分頻器代碼中。順便說一句,你爲什麼這樣做? ...因爲ListView有它的dividerdividerHeight

這裏就是我在一對夫婦使用上述佈局編碼分鐘想出了(只去掉了textColor屬性): enter image description here

上面列表中的代碼:

public class MyListActivity extends FragmentActivity { 
    private ListView listView; 

    @Override 
    protected void onCreate(Bundle savedInstance) { 
     super.onCreate(savedInstance); 
     setContentView(R.layout.so_list_layout); 
     listView = (ListView) findViewById(R.id.localListView); 
     fillListView(); 
    } 

    private void fillListView() { 
     final List<LDataRow> data = getRowData(); 
     ArrayAdapter<LDataRow> adapter = new ArrayAdapter<MyListActivity.LDataRow>(this, 
       R.layout.so_list_row, data) { 
      private LDataRow getDataRow(int position) { 
       return data.get(position); 
      } 

      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
       LDataRow row = getDataRow(position); 
       if (convertView == null) { 
        convertView = LayoutInflater.from(MyListActivity.this).inflate(
          R.layout.so_list_row, parent, false); 
       } 
       TextView companyName = (TextView) convertView.findViewById(R.id.companyName); 
       companyName.setText(row.getCompanyName()); 
       TextView exchange = (TextView) convertView.findViewById(R.id.exchange); 
       exchange.setText(row.getExchange()); 
       TextView symbol = (TextView) convertView.findViewById(R.id.symbol); 
       symbol.setText(row.getSymbol()); 
       TextView price = (TextView) convertView.findViewById(R.id.price); 
       price.setText(String.valueOf(row.getPrice())); 
       TextView change = (TextView) convertView.findViewById(R.id.change); 
       change.setText(String.valueOf(row.getChange())); 
       TextView percentChange = (TextView) convertView.findViewById(R.id.percentChange); 
       percentChange.setText(String.valueOf(row.getPercentChange())); 
       return convertView; 
      } 
     }; 
     listView.setAdapter(adapter); 
    } 

    private List<LDataRow> getRowData() { 
     ArrayList<LDataRow> result = new ArrayList<MyListActivity.LDataRow>(); 
     result.add(new LDataRow("Facebook", "Nasdaq", "E", 52.445, 0.0, 0)); 
     result.add(new LDataRow("Advanced Micro", "NYSE", "D", 3.23, 0.0, 0)); 
     result.add(new LDataRow("Genmas", "CPH", "G", -100, -3.0, -20.0)); 
     return result; 
    } 

    private static class LDataRow { 
     private String companyName; 

     private String exchange; 

     private String symbol; 

     private double price; 

     private double change; 

     private double percentChange; 

     public LDataRow(String companyName, String exchange, String symbol, double price, 
       double change, double percentChange) { 
      this.companyName = companyName; 
      this.exchange = exchange; 
      this.symbol = symbol; 
      this.price = price; 
      this.change = change; 
      this.percentChange = percentChange; 
     } 

     public String getCompanyName() { 
      return companyName; 
     } 

     public String getExchange() { 
      return exchange; 
     } 

     public String getSymbol() { 
      return symbol; 
     } 

     public double getPrice() { 
      return price; 
     } 

     public double getChange() { 
      return change; 
     } 

     public double getPercentChange() { 
      return percentChange; 
     } 

    } 
} 

使用這在頂部RelativeLayout有一個底部間距:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingBottom="8dp" > 

編輯如果你想自定義分隔線,你可以很好地指定一個自定義的drawable和大小。下面是我用一個簡單的layer-listmy_so_divider.xml完成:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 

    <item> 
     <shape android:shape="rectangle" > 
      <solid android:color="#ffffff" /> 
     </shape> 
    </item> 
    <item> 
     <shape android:shape="line" > 
      <stroke 
       android:width="1dp" 
       android:color="#000000" /> 
     </shape> 
    </item> 

</layer-list> 

將其設置在ListView:

<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/localListView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#00ffff" 
    android:divider="@drawable/my_so_divider" 
    android:dividerHeight="24dp" 
    android:footerDividersEnabled="false" 
    android:headerDividersEnabled="false" > 

</ListView> 

檢查footerDividersEnabledheaderDividersEnableddividerdividerHeight屬性...隨意發揮與drawable一起。在下圖中的效果: enter image description here

+0

我添加了listfragment和listadapter。請看我做錯了什麼?順便說一句。我需要顯示分隔線,除了頂部和底部的分隔線隱藏。 – talx

+0

更新回答提高分隔符...看看 – gunar

+0

尼斯,我真的需要保留我製作的RelativeLayout而不是LinearLayout。你能看到爲什麼在截圖中有很大的空間。我的代碼有什麼問題? – talx

0
// try this 
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="5dp"> 

    <LinearLayout 
     android:layout_height="wrap_content" 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/companyName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:singleLine="true" 
      android:textColor="@color/table_text_light_selector" 
      android:text="companyName" 
      android:textAppearance="?android:attr/textAppearanceMedium"/> 

     <LinearLayout 
      android:layout_height="wrap_content" 
      android:layout_width="match_parent"> 
      <TextView 
       android:id="@+id/symbol" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="5dp" 
       android:textColor="@color/table_text_light_selector" 
       android:textAppearance="?android:attr/textAppearanceSmall" 
       android:text="symbol"/> 
      <TextView 
       android:id="@+id/exchange" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="exchange" 
       android:layout_marginTop="5dp" 
       android:layout_marginLeft="5dp" 
       android:textColor="@color/table_text_light_selector" 
       android:textAppearance="?android:attr/textAppearanceSmall"/> 
     </LinearLayout> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:gravity="right" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/price" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:singleLine="true" 
      android:ellipsize="end" 
      android:textColor="@color/table_text_light_selector" 
      android:text="price" 
      android:textAppearance="?android:attr/textAppearanceMedium"/> 

     <LinearLayout 
      android:layout_height="wrap_content" 
      android:layout_width="wrap_content"> 
      <TextView 
       android:id="@+id/percentChange" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="percentChange" 
       android:layout_marginTop="5dp" 
       android:textColor="@color/table_text_light_selector" 
       android:textAppearance="?android:attr/textAppearanceSmall" 
       android:layout_marginRight="5dp"/> 
      <TextView 
       android:id="@+id/change" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="change" 
       android:layout_marginTop="5dp" 
       android:textColor="@color/table_text_light_selector" 
       android:textAppearance="?android:attr/textAppearanceSmall"/> 
     </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 
0

試試下面的代碼。它會給你類似的結果,你需要:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:layout_gravity="center" 
     android:gravity="center"> 

    <TextView 
      android:id="@+id/companyName" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:singleLine="true" 
      android:text="facebook" 
      android:layout_marginLeft="5dp" 
      android:layout_marginRight="5dp" 
      android:textColor="@color/table_text_selector" 
      android:textAppearance="?android:attr/textAppearanceMedium"/> 

    <TextView 
      android:id="@+id/price" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="facebook" 
      android:layout_marginRight="5dp" 
      android:textColor="@color/table_text_selector" 
      android:textAppearance="?android:attr/textAppearanceMedium"/> 

    </LinearLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:layout_gravity="center" 
     android:gravity="center" 
     android:layout_marginTop="5dp"> 

    <TextView 
      android:id="@+id/exchange" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:text="facebook" 
      android:layout_marginLeft="5dp" 
      android:layout_marginRight="5dp" 
      android:textColor="@color/table_text_light_selector" 
      android:textAppearance="?android:attr/textAppearanceSmall"/> 

    <TextView 
      android:id="@+id/percentChange" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="22%" 
      android:textColor="@color/table_stock_change_text" 
      android:textAppearance="?android:attr/textAppearanceSmall" 
      android:layout_marginRight="5dp"/> 

    <TextView 
      android:id="@+id/change" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="0.0" 
      android:layout_marginRight="5dp" 
      android:textColor="@color/table_stock_change_text" 
      android:textAppearance="?android:attr/textAppearanceSmall"/> 

    </LinearLayout> 

</LinearLayout>