1

タイトルの最初の文字がリストの最初の文字と一致した場合、listView の行のラベルを非表示または表示する必要があります。はっきりと理解するのに役立つ写真を添付し​​ます。 ここに画像の説明を入力

連絡先の ArrayList を作成するときに、このようにしようとしました:

public ArrayList<ContactItem> getDisplayContacts(Context context)
    {   
        ArrayList<ContactItem> contactsList = null;
        DatabaseHandler db = new DatabaseHandler(context.getApplicationContext());
         try {
            Dao<ContactItem,Integer> daoSubject = db.getContactDao();
            contactsList = (ArrayList<ContactItem>) daoSubject.queryForAll();
         }
         catch(Exception e)
         {e.printStackTrace();}
         Collections.sort(contactsList, new Comparator<ContactItem>() {
                @Override
                public int compare(ContactItem lhs, ContactItem rhs) {
                    return lhs.getName().compareTo(rhs.getName());
                }
            });
         for (int i =0; i< contactsList.size()-1;i++)
         {
             if (!contactsList.get(i).getName().substring(0,1).equalsIgnoreCase(contactsList.get(i+1).getName().substring(0,1)))
                 contactsList.get(i).setContactLabel(true);
             else 
                 contactsList.get(i).setContactLabel(false);
         }
        return contactsList;

    }

しかし、適切な結果が得られませんでした。また、すべてのビューをカスタム ArrayAdapter に入れ、li​​stView の作成後に変更しようとしましたが、これも役に立ちませんでした。getView でタイトルを確認し、ラベルを表示/非表示にすることも役に立ちませんでした。どんな助けにも非常に感謝します。

4

2 に答える 2

1

まず第一に、「レター項目」があるべきすべての位置を覚えておいてください。'a' の場合はおそらく 0 であり、'b' の場合は 'a' で始まる名前の数、'c' の場合は 'b' 位置 + 'b' で始まる項目の数などです。これを String 型の SparseArray にします。

これをすべて取得したら、すべてのデータを SparseArray に配置する必要があります。ここで、各項目の inex が前の計算に合わせて調整されます。たとえば、Alex - 1 (0 は 'a' ラベルの場合)、Bob - 3 (2 は 'b' ラベルの場合) などです。

次に、カスタム アダプターとオーバーライド メソッドを記述します。

public View getView(int position, View convertView, ViewGroup parent)

したがって、'position' が最初の配列に含まれているかのように、適切な後者の 'label'-view を返します。それ以外の場合は、2 番目の配列にアクセスして共通の行項目を取得します。

英語は私の母国語ではないので、何かわかりにくいかもしれません。遠慮なく質問してください。

于 2013-08-09T04:53:02.533 に答える