16

ListActivityを拡張したアクティビティで「android-support-v7-appcompat」のActionBarActivityを利用する方法。

たとえば、アクティビティがあります

public class xxxxxListActivity
  extends ListActivity implements OnItemSelectedListener  { 
  // ...................
} 

上記のアクティビティで「ActionBarActivity」を使用したいのですが、Java が多重継承をサポートしていないため、動作させることができません。

4

6 に答える 6

41

ActionBarListActivity の実装は次のとおりです。

public abstract class ActionBarListActivity extends ActionBarActivity {

private ListView mListView;

protected ListView getListView() {
    if (mListView == null) {
        mListView = (ListView) findViewById(android.R.id.list);
    }
    return mListView;
}

protected void setListAdapter(ListAdapter adapter) {
    getListView().setAdapter(adapter);
}

protected ListAdapter getListAdapter() {
    ListAdapter adapter = getListView().getAdapter();
    if (adapter instanceof HeaderViewListAdapter) {
        return ((HeaderViewListAdapter)adapter).getWrappedAdapter();
    } else {
        return adapter;
    }
}
}

通常の ListActivity と同様に、ID が android.R.id.list (XML では "@android:id/list") の ListView を含むレイアウトが必要です。

getListAdapter() の特徴は、ヘッダー ビューが ListView に追加された場合を処理することです。ListView は独自のアダプターをHeaderViewListAdapterに設定しているように見えるため、キャスト エラーを防ぐためにラップされたアダプターを取得する必要があります。

編集: onListItemClick の必要性を満たすために、この関数を追加してみてください:

protected void onListItemClick(ListView lv, View v, int position, long id) {
    getListView().getOnItemClickListener().onItemClick(lv, v, position, id);
}
于 2013-10-09T22:00:51.317 に答える
0

受け入れられたものに基づく私の答え、およびonListItemClick実装も含まれています。しかし、空のビューには問題があります。

public abstract class ActionBarListActivity extends ActionBarActivity {

private ListView mListView;

protected ListView getListView() {
    if (mListView == null) {
        mListView = (ListView) findViewById(android.R.id.list);
        mListView.setOnItemClickListener(mOnClickListener);
    }
    return mListView;
}

protected void setListAdapter(ListAdapter adapter) {
    getListView().setAdapter(adapter);
}

protected ListAdapter getListAdapter() {
    ListAdapter adapter = getListView().getAdapter();
    if (adapter instanceof HeaderViewListAdapter) {
        return ((HeaderViewListAdapter) adapter).getWrappedAdapter();
    } else {
        return adapter;
    }
}

protected void onListItemClick(ListView l, View v, int position, long id) { }

private AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        onListItemClick((ListView) parent, v, position, id);
    }
};
}
于 2014-06-06T06:56:14.443 に答える
0

クラスに次のコード行を追加し、クラスが AdapterView.OnItemClickListener を実装していることを確認します。

getListView().setOnItemClickListener(this);
于 2015-02-15T18:24:14.120 に答える