2015-01-21 3 views
1

Выглядит прямо в Android Studio, но не работает, когда выполняется на моем телефоне.
Я использую простой линейный макет (горизонтальный) с двумя линейными макетами (вертикальными) внутри, каждый из которых занимает 50% пространства строки в списке. Вот код:Android - Линейный вес макета не работает должным образом в элементах списка.

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

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="0dp" 
     android:layout_height="fill_parent" 
     android:layout_weight="0.5"> 

     <LinearLayout 
      android:orientation="horizontal" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content"> 

      <TextView 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textAppearance="?android:attr/textAppearanceMedium" 
       android:text="001" 
       android:id="@+id/pokemonNumber" 
       android:layout_marginLeft="5dp" /> 

      <TextView 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:textAppearance="?android:attr/textAppearanceMedium" 
       android:text="Bulbasaur" 
       android:id="@+id/pokemonName" 
       android:layout_marginLeft="10dp" /> 

     </LinearLayout> 

     <LinearLayout 
      android:orientation="vertical" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 

      <TextView 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:textAppearance="?android:attr/textAppearanceSmall" 
       android:text="Grass" 
       android:id="@+id/pokemonTypes" 
       android:layout_marginLeft="50dp" /> 
     </LinearLayout> 
    </LinearLayout> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="0dp" 
     android:layout_height="fill_parent" 
     android:layout_weight="0.5"> 

     <ImageView 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:id="@+id/pokemonImage" 
      android:src="#ff65ff4f" /> 

    </LinearLayout> 

</LinearLayout> 

Я могу загрузить фотографии, если вам нужно получить визуальные, но в основном это должно быть просто два линейные макеты занимают по 50% от их родительских линейного расположения, по горизонтали. Любые идеи, почему это не работает?

EDIT: пристроен картинки для ясности:

Как это выглядит в Android Studio (правильный): http://i.stack.imgur.com/bxhxi.png

Как это выглядит на самом деле (неправильно): http://i.stack.imgur.com/jPXCW.png

EDIT2: это расположение строк для ListView

EDIT3: Код, где используется такая схема:

public class DexListAdapter extends BaseAdapter { 
    private LayoutInflater mInflater; 
    private List<Pokemon> mPokes; 
    private String mRowLayout = "pokemon_list_item"; 
    private Context mContext; 

    public DexListAdapter(Context context, List<Pokemon> pokes) { 
     mInflater = LayoutInflater.from(context); 
     mPokes = pokes; 
     mContext = context; 
    } 

    @Override 
    public int getCount() { 
     return mPokes.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mPokes.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view; 
     ViewHolder holder; 

     if(convertView == null) { 
      int resID = mContext.getResources().getIdentifier(mRowLayout, "layout", mContext.getPackageName()); 
      view = mInflater.inflate(resID, parent, false); 

      holder = new ViewHolder(); 

      holder.number = (TextView)view.findViewById(R.id.pokemonNumber); 
      holder.name = (TextView)view.findViewById(R.id.pokemonName); 
      holder.types = (TextView)view.findViewById(R.id.pokemonTypes); 
      holder.image = (ImageView)view.findViewById(R.id.pokemonImage); 

      view.setTag(holder); 
     } else { 
      view = convertView; 
      holder = (ViewHolder)view.getTag(); 
     } 

     Pokemon poke = mPokes.get(position); 
     //Set info from pokemon object to listview item 
     holder.number.setText(poke.getStringNumber()); 
     holder.name.setText(poke.getName()); 
     holder.types.setText(poke.getTypeOne() + " " + poke.getTypeTwo()); 

     return view; 
    } 

    private class ViewHolder { 
     public TextView number, name, types; 
     public ImageView image; 
    } 
} 

Над кодом называется здесь (как часть фрагмента, используемого в панели навигации деятельности):

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_pokelist, container, false); 
    ListView l1=(ListView)rootView.findViewById(R.id.pokeList); 
    l1.setAdapter(new DexListAdapter(c,pokemonList)); 
    return rootView; 
} 

EDIT4: Код для ListView

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

    <ListView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/pokeList" /> 
</LinearLayout> 
+0

Показать код, в котором вы действительно используете этот макет - вот в чем проблема. – dominicoder

+0

Конечно, добавлено в редактировании. Спасибо за помощь. – mmmyum

+0

Сделайте ListView заполнением родителя, используйте match_parent или fill_parent. Я думаю, что содержимое обложек только делает его таким же большим, как TextViews, и весы не используются. – torque203

ответ

4

Проблема заключалась в том, что ListView имел ширину на wrap_content, которая не позволяла LinearLayout использовать свои весовые свойства. Таким образом, решение, как показано ниже:

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

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/pokeList" /> 
</LinearLayout> 

Я также прочитал в вопросе здесь (не могу найти ссылку, к сожалению), что это не хорошо, чтобы дать ListView wrap_content как высота, всегда стараюсь быть конкретными, например match_parent или использовать другие ограничения, чтобы он знал, что это высота до того, как будут добавлены какие-либо дети.

0

Попробуйте заменить:

view = mInflater.inflate(resID, parent, false); 

с

view = mInflater.inflate(resID, null, false); 

Первый говорит: «Используйте мой родитель, чтобы выяснить мои параметры макета», второй говорит «используйте параметры параметров макета ресурса макета».

+0

Без изменений при использовании 'null' вместо 'parent' - любые другие идеи? – mmmyum

+0

Хм - как выглядит компоновка с ListView? – dominicoder

+0

Очень просто, добавлено редактирование – mmmyum

Смежные вопросы