2013-06-14 3 views
0

Я использую gridview для представления различных статей, состоящих из двух текстовых полей. Из-за различного количества текста высота каждого элемента различна, а строка должна иметь размер самого большого элемента строки. В gridview используется colnum = autofit.Gridview row height mess up when scrooling

В качестве следующего скриншота до и после прокрутки показывается поведение, как и ожидалось, так как я прокручиваю вниз и снова: строки беспорядок и сокращение содержимого больших предметов. Что мне не хватает?

Gridview перед тем прокрутки:

screenshot of gridview before scrolling with proper

GridView после прокрутки вниз и вверх:

screenshot of gridview after scrolling with messed up items

Далее код:

элемент XML-код

<?xml version="1.0" encoding="utf-8"?> 

<TextView 
    android:id="@+id/title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="10dp" 
    android:layout_marginTop="14dp" 
    android:textColor="#040404" 
    android:textSize="20sp" 
    android:textStyle="bold" 
    android:typeface="serif" /> 

<TextView 
    android:id="@+id/text" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="10dp" 
    android:textColor="#343434" 
    android:textSize="14sp" 
    android:typeface="serif" /> 

</LinearLayout> 

Мой ListAdapter (перерабатывает взгляды, если это возможно):

общественного класса SearchResultListViewAdapter распространяется ArrayAdapter {

Context     context; 
Newspaper     newspaper; 
List<SearchResultListItem> searchResults; 
int      viewStyle; 

public SearchResultListViewAdapter(Context context, int resourceId, List<SearchResultListItem> searchResults, int viewStyle) { 
    super(context, resourceId, searchResults); 
    this.context = context; 
    this.searchResults = searchResults; 
    this.viewStyle = viewStyle; 
} 

/* private view holder class */ 
private class ViewHolder 
{ 
    TextView txtTitle; 
    TextView txtText; 
} 

public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View gridItem; 
    ViewHolder holder = null; 

    if (convertView == null) 
    { 
     LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     if (this.viewStyle == 0) 
     { 
      gridItem = mInflater.inflate(R.layout.searchresult_list_item, null); 
     } else 
     { 
      gridItem = mInflater.inflate(R.layout.searchresult_grid_item, null); 
     } 
     holder = new ViewHolder(); 
    } else { 
     gridItem = convertView; 
     holder = (ViewHolder) gridItem.getTag(); 
    } 

    holder.txtText = (TextView) gridItem.findViewById(R.id.text); 
    holder.txtTitle = (TextView) gridItem.findViewById(R.id.title); 
    gridItem.setTag(holder); 
    SearchResultListItem rowItem = getItem(position); 
    holder.txtText.setText(Html.fromHtml(rowItem.getText()), TextView.BufferType.SPANNABLE); 
    holder.txtTitle.setText(Html.fromHtml(rowItem.getTitle()), TextView.BufferType.SPANNABLE); 

    return gridItem; 
} 
} 

И, наконец, моя макет деятельности содержащий gridview:

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

<TableRow 
    android:id="@+id/tableRow3" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" > 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" > 

     <EditText 
      android:id="@+id/searchPatternInput" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_toLeftOf="@+id/loadSearchResults" 
      android:imeOptions="actionSearch" 
      android:inputType="text" /> 

     <ImageButton 
      android:id="@+id/showExtendedSearch" 
      style="?android:attr/buttonBarButtonStyle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentTop="true" 
      android:src="@drawable/ic_action_filter" /> 

     <ImageButton 
      android:id="@+id/loadSearchResults" 
      style="?android:attr/buttonBarButtonStyle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_toLeftOf="@+id/showExtendedSearch" 
      android:src="@drawable/ic_action_search" /> 
    </RelativeLayout> 
</TableRow> 

<TableRow 
    android:id="@+id/tableRow2" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <RelativeLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="0dp" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" 
     android:background="#ffffff" > 

     <ImageSwitcher 
      android:id="@+id/nothingLoaded" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerInParent="true" 
      android:background="@drawable/ic_nothing_loaded" > 
     </ImageSwitcher> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_alignParentTop="true" > 

      <GridView 
       android:id="@+id/searchResultThumbnailsGridView" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:columnWidth="160dp" 
       android:divider="#b5b5b5" 
       android:dividerHeight="1dp" 
       android:gravity="center" 
       android:horizontalSpacing="4dp" 
       android:listSelector="@drawable/list_selector" 
       android:numColumns="auto_fit" 
       android:padding="10dp" 
       android:layout_weight="1" 
       android:stretchMode="columnWidth" 
       android:verticalSpacing="4dp" /> 

     </LinearLayout> 
    </RelativeLayout> 
</TableRow> 

</TableLayout> 
+0

Возможно, это помогает, если вы определяете в своем item.xml значения textViews paddingTop – Opiatefuchs

+0

К сожалению, это ничего не меняет. любые другие подсказки? – alex

ответ

0

я перешел на использование компонент третьей стороны. StaggeredGridView подходит для меня, больше информации можно найти here.

0

Возможно, у вас возникли путаницы с использованием методов View.setTag() и View.getTag(). Попробуйте это:

public View getView(int position, View convertView, ViewGroup parent) 
{ 
ViewHolder holder = null; 

if (convertView == null) 
{ 
    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    if (this.viewStyle == 0) 
    { 
     convertView = mInflater.inflate(R.layout.searchresult_list_item, null); 
    } else 
    { 
     convertView = mInflater.inflate(R.layout.searchresult_grid_item, null); 
    } 
    holder = new ViewHolder(); 

    //Always use View.findViewById() and View.setTag() here 
    holder.txtText = (TextView) convertView.findViewById(R.id.text); 
    holder.txtTitle = (TextView) convertView.findViewById(R.id.title); 

    convertView.setTag(holder); 
} else { 
    //Always use View.getTag() here 
    holder = (ViewHolder) convertView.getTag(); 
} 

//Always set your data here 
SearchResultListItem rowItem = getItem(position); 
holder.txtText.setText(Html.fromHtml(rowItem.getText()), TextView.BufferType.SPANNABLE); 
holder.txtTitle.setText(Html.fromHtml(rowItem.getTitle()), TextView.BufferType.SPANNABLE); 

return convertView; 

}

+0

Ваш код эквивалентен моему, кроме объявления переменной «griditem». Но замена моего кода на ваш код не изменяет поведение вообще – alex