2013-01-11 43 views
1

我有可滚动的列表视图项目。每个项目都有以下布局。列表视图项目滚动后更改顺序

根据需要显示或隐藏ID为customer_menu_index的LinearLayout。 Ramaining元素显示在每个方法调用中。

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" > 

<LinearLayout 
    android:id="@+id/customer_menu_index" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/menu_listview_item_alphabet_bg" 
    android:orientation="horizontal" 
    android:visibility="gone"> 

    <TextView 
     android:id="@+id/customer_menu_index_letter" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="5dp" 
     android:paddingBottom="5dp" 
     android:paddingTop="5dp" 
     android:text="bla" 
     android:textColor="@color/menu_listview_item_title" 
     android:textSize="10sp" 
     android:textStyle="bold" 
     android:typeface="sans" /> 
</LinearLayout> 

<RelativeLayout 
    android:id="@+id/customer_menu_item" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/menu_listview_item_selector" 
    android:orientation="horizontal" > 

    <TextView 
     android:id="@+id/customer_menu_item_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="0dp" 
     android:paddingBottom="0dp" 
     android:paddingTop="5dp" 
     android:textColor="@color/menu_listview_item_title" 
     android:textSize="10sp" 
     android:textStyle="bold" 
     android:typeface="sans" /> 

    <TextView 
     android:id="@+id/customer_menu_item_subtitle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/customer_menu_item_title" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="0dp" 
     android:paddingBottom="5dp" 
     android:paddingTop="1dp" 
     android:textColor="@color/menu_listview_item_subtitle" 
     android:textSize="8sp" 
     android:textStyle="normal" 
     android:typeface="sans" /> 
</RelativeLayout> 

</LinearLayout> 

我的BaseAdapter方法getView使用此布局。实现getView方法。

public View getView(int position, View convertView, ViewGroup parentView) { 

    View vi = convertView; 

    if (convertView == null) 
    { 
     vi = inflater.inflate(R.layout.customer_menu_index_item, null); 
    } 

    LinearLayout indexLayout = (LinearLayout) vi.findViewById(R.id.customer_menu_index); 

    HashMap<String, String> category = new HashMap<String, String>(); 
    category = mData.get(position); 

    String currentIndexLetter = category.get(CustomerMenu.KEY_COMPANY).substring(0, 1); 
    if (currentIndexLetter.equals(mLastIndexLetter) == false) 
    { 
     TextView letter = (TextView) vi.findViewById(R.id.customer_menu_index_letter); 
     letter.setText(currentIndexLetter); 
     mLastIndexLetter = currentIndexLetter; 
     indexLayout.setVisibility(LinearLayout.VISIBLE); 
    } 

    TextView title = (TextView) vi.findViewById(R.id.customer_menu_item_title); 
    TextView subtitle = (TextView) vi.findViewById(R.id.customer_menu_item_subtitle); 
    title.setText(category.get(CustomerMenu.KEY_COMPANY)); 
    subtitle.setText(category.get(CustomerMenu.KEY_CONTACT_PERSON)); 

    return vi; 
} 

它加载后工作正常。但是当我滚动列表视图时,项目的顺序发生了变化。

+0

“//用text填充数据” - 这部分可能是相关的。 – dokkaebi

+0

以及'if(...){' –

+1

是什么问题? – misco

回答

0

你必须有一个匹配else语句显示或隐藏的LinearLayout中:

if (currentIndexLetter.equals(mLastIndexLetter) == false) 
{ 
    TextView letter = (TextView) vi.findViewById(R.id.customer_menu_index_letter); 
    letter.setText(currentIndexLetter); 
    mLastIndexLetter = currentIndexLetter; 
    indexLayout.setVisibility(LinearLayout.VISIBLE); 
} 
else { 
    indexLayout.setVisibility(LinearLayout.GONE); 
} 

其他两个点:

  • if(a.equals(b) == false)相同if(!a.equals(b))。这只是一条捷径,你不必使用它。
  • 你还应该考虑使用ViewHolder来加速你的代码。
+0

GONE在XML文件'android:visibility =“gone”'中设置。此更改不能解决问题。 – misco

+1

“GONE在XML中设置”在滚动ListView后,这将不执行任何操作。您应该了解ListView的RecycleBin如何工作以及如何使用ViewHolders,这[Google Talk](http://www.google.com/events/io/2009/sessions/TurboChargeUiAndroidFast.html)详细解释了这些概念。如果数据乱序,请使用您的调试器来验证'mData.get(position);'返回您所期望的数据。 – Sam

+0

谢谢您的参考。我从来没有听说过关于ListView的RecycleBin。 – misco

相关问题