2012-05-03 4 views
0

私は実際にデータベースから項目を入力することによってListViewを作成しています。
リストビューの終わりに達すると、私はいくつかの項目を追加します。今、私は、データベースから返された値に基づいて、ListViewの仕切りをします。データベースの2つの連続した値が同じであれば、それらを細い線で区切り、太い線ではないにします。Listview custom ListDivider

私は条件に基づいて新しいレイアウトを膨らませています。この

if (convertView == null) { 

      holder = new ViewHolder(); 

      if (eventSource.get(position).equalsIgnoreCase("asdsadas") 
        && eventSource.get(position + 1).equalsIgnoreCase(
          "fdgdfgfd") 
        || eventSource.get(position).equalsIgnoreCase(
          "dfgdfgdfg") 
        && eventSource.get(position + 1).equalsIgnoreCase(
          "jgghjhhgg")) { 
       convertView = mInflater.inflate(R.layout.list_adapter, null); 
      } else { 
       convertView = mInflater.inflate(R.layout.list_adapterthinline, 
         null); 
      } 

のようにアダプタを介してそれらを設定してみました。これは初めてのことですが、下にスクロールしてから、ビューが変わります。すべてが混ざり合ってしまいます。

私はアクティビティでディバイダの高さを設定しようとしました。このように、私はonCreateとonScrollリスナで 'setdivider'メソッドを呼び出します。

public void setdivider() { 
     // TODO Auto-generated method stub 
     for (int i = 0; i < listSource.size() - 1; i++) { 


      if (!listSource.get(i).equalsIgnoreCase(
        listSource.get(i + 1))) { 
       Log.v("inside not equals", "become smalllllllllllllllll"); 
       list.setDivider(red); 
       list.setDividerHeight(5); 
      } else if (listSource.get(i).equalsIgnoreCase(
        listSource.get(i + 1))) { 
       Log.v("inside equals", "become bigggggggggggg"); 
       list.setDivider(blue); 
       list.setDividerHeight(10); 
      } 
     } 
    } 

ただし、両方のログコメントはLogCatに表示されますが、リストには1つのディバイダしか設定されていません。
どこが間違っているのか教えてください。

答えて

1

ListViewキャッシュの景色なので、あなたの周りにスクロールすると、ビューが再利用されます。そのため、convertViewは常にnullではありません。しかし、あなたは2種類のビューを持っているので、あなたが戻って来るconvertViewがあなたが望むように、ListViewにそれを伝える必要があります。あなたはAdapter.getItemViewType()Adapter.getViewTypeCount()を実装することでそれを行います。

あなたの例では、getViewTypeCountは2を返し、getItemViewTypeは、それが除算器の場合は1を返し、そうでない場合は0を返します。

+0

ありがとうございました。 – user669444

+0

その仕組みが不思議な人には、このリンクを参照してください。http://logc.at/2011/10/10/handling-listviews-with-multiple-row-types/ – user669444

0

は、1つのレイアウトでレイアウトR.layout.list_adapterとR.layout.list_adapterthinline をマージします。

デフォルトでは、細線は消えました。必要に応じて表示します。

.....レイアウトはここにあります。

行が必要な場合。

convertView.findViewById(R.id.thin_line).setVisible(View.Visible) 

あなたがそれを必要としないとき。

convertView.findViewById(R.id.thin_line).setVisible(View.Gone)

+0

回答ありがとうございますが、これはうまくいきません。それは私がしたことと同じです。それは適切に表示されますが、スクロールしてから上がってきて、ひそかに行きます。私は作成されたビューが再利用され、仕切りが混ざり合っていると思います。 – user669444

+0

細い線を忘れてしまったと思います。 –

+0

いいえ、私はそれを忘れていませんでした。私もそれをしました。 – user669444