web-dev-qa-db-ja.com

AndroidクラスBaseAdapterのメソッドgetItemおよびgetItemIdの意図は何ですか?

Android SDKのクラスAdapterのメソッド getItem および getItemId の目的に興味があります。

説明から、getItemは基になるデータを返すはずです。したがって、名前の配列["cat","dog","red"]があり、それを使用してアダプターaを作成すると、a.getItem(1)は「dog」を返す必要がありますか? a.getItemId(1)は何を返すべきですか?

これらの方法を実際に使用した場合、例を挙げていただけますか?

150
oneporter

これらのメソッドは、リストのデータにアクセスするためのよりクリーンなアプローチと考えています。 myListData.get(position)のようなものを介してアダプタオブジェクトに直接アクセスする代わりに、adapter.get(position)のようなアダプタを単純に呼び出すことができます。

getItemIdについても同様です。通常、リスト内のオブジェクトの一意のIDに基づいてタスクを実行する場合、このメソッドを使用します。これは、データベースを操作するときに特に役立ちます。返されたidは、データベース内のオブジェクトへの参照である可能性があり、そのオブジェクトに対して異なる操作(更新/削除/など)を実行できます。

したがって、myListData.get(position).getId()のような生データオブジェクトからIDにアクセスする代わりに、adapter.getItemId(position)を使用できます。

これらのメソッドを使用する必要があると感じた一例は、 SeparatedListViewAdapter を使用したプロジェクトでした。このアダプターには、複数の異なる種類のアダプターを含めることができ、それぞれが異なるタイプ(通常)のデータを表します。 SeparatedListViewAdaptergetItem(position)を呼び出す場合、返されるオブジェクトは、送信する位置が「セクション」に応じて異なる場合があります。

たとえば、リストに2つのセクションがある場合(fruitとcandy):getItem(position)positionを使用した場合、たまたまfruitセクションでは、getItem(position)positionを要求した場合とは異なるオブジェクトを受け取りますcandyセクション。次に、getItemId(position)が返すデータの種類を表すgetItem(position)にある種の定数ID値を返すか、instanceofを使用して、所有しているオブジェクトを判別します。

私が言及したこと以外は、これらの方法を本当に使用する必要があると感じたことはありません

86
binnyb

まあ、この質問はよりシンプルで簡単な方法で答えられるようです... :-)

簡単に言えば、Androidを使用すると、longを任意のListViewアイテムに添付できます。これはとても簡単です。システムがユーザーの選択を通知すると、three変数を識別する変数を受け取り、選択内容を通知します。

  • ビュー自体への参照、
  • リスト内の数値の位置、
  • このlongを個々の要素に追加しました。

特定のケースでこれら3つのうちどれを扱うのが最も簡単かを決めるのはあなた次第ですが、常に3つすべてを選択する必要があります。このlongは、アイテムに自動的に添付されたタグであると考えてください。読み取りがさらに簡単で簡単なだけです。

それが通常行うことについての誤解は、単純な慣習に由来します。この3番目のIDを実際に使用しない場合でも、すべてのアダプターはgetItemId()を提供する必要があります。そのため、慣例により、これらのアダプター(SDKのサンプルまたはWeb全体のサンプルを含む)は、単一の理由でpositionを返すだけです。これは常に一意です。それでも、アダプターがpositionを返す場合、これは本当にこの機能をまったく使用したくないを意味します。とにかくpositionは既に知られているからです。

したがって、適切と思われる他の値を返す必要がある場合は、お気軽にお問い合わせください。

@Override
public long getItemId(int position) {
  return data.get(position).Id;
}
31
Gábor

getItemIdメソッドは、主にSQLiteデータベースによってサポートされるカーソルで動作するように設計されています。位置1のアイテムの基になるカーソルのidフィールドを返します。

あなたの場合、位置1のアイテムのIDはありません。ArrayAdapterの実装は-1または0を返すと仮定しています。

編集:実際には、位置を返すだけです:この場合は1

6
Femi

getItemgetItemIdを実装した後、 ListView.getItemAtPositionListView.getItemIdAtPosition を使用して、直接データにアクセスできることに言及したいアダプターを通過する。これは、onClickリスナーを実装するときに特に便利です。

4
leo9r

getItemIdcorrectlyを実装すると、非常に便利です。

例:

アルバムのリストがあります:

class Album{
     String coverUrl;
     String title;
}

そして、次のようにgetItemIdを実装します:

@Override
public long getItemId(int position){
    Album album = mListOfAlbums.get(position);
    return (album.coverUrl + album.title).hashcode();
}

これで、アイテムIDはcoverUrlおよびtitleフィールドの値に依存し、アダプターを変更してnotifyDataSetChanged()を呼び出すと、アダプターはgetItemId( )各要素のメソッドとIDが変更されたthouseアイテムのみを更新します

これは、getView()で「重い」操作を行う場合に非常に便利です。

ところで:これを機能させるには、hasStableIds()メソッドがfalseを返すことを確認する必要があります。

4
Danylo Volokh

getItemまたはgetItemIdは、主にリスト内のアイテムを持つデータを添付するために設計された少数のメソッドです。 getItemの場合、リスト内のアイテムにアタッチするオブジェクトを渡すことができます。通常、人々はnullを返します。 getItemIdは、リスト内の同じアイテムに添付できる一意のlong値です。通常、人々はリスト内の位置を返します。

使用は何ですか。さて、これらの値はリスト内のアイテムにバインドされているため、ユーザーがアイテムをクリックするとそれらを抽出できます。これらの値には、AdapterViewメソッドを介してアクセスできます。

// template class to create list item objects
class MyListItem{
    public String name;
    public long dbId;

    public MyListItem(String name, long dbId){
        this.name = name;
        this.dbId = dbId;
    }
}

///////////////////////////////////////////////////////////

// create ArrayList of MyListItem
ArrayList<MyListItem> myListItems = new ArrayList<MyListItem>(10);

// override BaseAdapter methods
@Override
public Object getItem(int position) {
    // return actual object <MyListItem>
    // which will be available with item in ListView
    return myListItems.get(position);
}

@Override
public long getItemId(int position) {
    // return id of database document object
    return myListItems.get(position).dbId;
}

///////////////////////////////////////////////////////////

// on list item click, get name and database document id
my_list_view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        // extract item data
        MyListItem selectedItem = (MyListItem)parent.getItemAtPosition(position);      
        System.out.println("Your name is : " + selectedItem.name);

        // extract database ref id
        long dbId = id;

        // or you could also use
        long dbId = parent.getItemIdAtPosition(position);
    }
});
1
Uday Hiwarale