1. ホーム
  2. android

[解決済み] ListView addHeaderView の位置が1つ増える?

2023-01-10 03:26:01

質問

下記はListViewのコードスニペットです。emptyViewとheaderViewを追加しています。headerViewを追加すると、onItemClickでの位置が1つ上がります。

つまり、headerViewがなければ最初のリスト要素の位置は0になり、headerViewがあれば最初のリスト要素の位置は1になるわけです

これは、例えばgetItem()を呼び出すときや、他のメソッドを使用するときに、私のアダプタでエラーを引き起こします(下記参照)。 奇妙なことに、アダプタのgetView()メソッドでは、headerViewが追加されていても、最初のリスト要素の位置が0で要求されます!

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ListView list = (ListView) viewSwitcher.findViewById(R.id.list);
    View emptyView = viewSwitcher.findViewById(R.id.empty);
    list.setEmptyView(emptyView);

    View sectionHeading = inflater.inflate(R.layout.heading, list, false);
    TextView sectionHeadingTextView = (TextView) sectionHeading.findViewById(R.id.headingText);
    sectionHeadingTextView.setText(headerText);
    list.addHeaderView(sectionHeading);

    list.setAdapter(listAdapter);

    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            listAdapter.getItem(position);
            //Do something with it
        }
    });
}

いくつかのアダプタのメソッドです。

@Override
public int getViewTypeCount() {
    return TYPE_COUNT;
}

@Override
public int getItemViewType(int position) {
    return (position < items.size()) ? ITEM_NORMAL : ITEM_ADVANCED;
}

    @Override
public Product getItem(int position) {
    return items.get(position);
}
@Override
public boolean areAllItemsEnabled() {
    return false;
}

@Override
public boolean isEnabled(int position) {
    return (position < items.size());
}

これはheaderViewを追加する際の通常の動作でしょうか?また、どのように私のアダプタで問題を克服するのですか?

どのように解決するのですか?

私はちょうどこの問題に出くわしたので、最良の方法は ListView.getItemAtPosition(position) の代わりに ListAdapter.getItem(position) として ListView バージョンはヘッダを考慮します。

代わりにこうしてください。

myListView.getItemAtPosition(position)