2013-08-23 25 views
16

ListActivity genişletir etkinlikte "android-support-v7-appcompat" ActionBarActivity nasıl kullanılır. ActionBarAktivite "android-support-v7-appcompat" ve aynı aktivite içinde ListActivity

Örnek için ben "ActionBarActivity" kullanmak istiyorum Yukarıdaki etkinlikte bir Aktivite

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

var ama java desteği çoklu miras dosent olarak almak o çalışma için güçlü değilim.

+3

Kullanım 'ActionBarActivity' ve uygulamak' kendini ListView'. – Luksprog

cevap

41

ActionBarListActivity bir uygulamasıdır var android.R.id.list kimliğine sahip bir ListView içeren düzen ("@android: id/list) "XML'de).

getListAdapter() 'deki spiel, ListView'e başlık görünümlerinin eklendiği durumları ele almaktır. ListView, kendi bağdaştırıcısını HeaderViewListAdapter olarak ayarlar, bu nedenle döküm hatalarını önlemek için sarılmış bağdaştırıcıyı denemeliyiz.

Düzenleme: onListItemClick ihtiyacını karşılamak için bu işlevi eklemeyi deneyin:

protected void onListItemClick(ListView lv, View v, int position, long id) { 
    getListView().getOnItemClickListener().onItemClick(lv, v, position, id); 
} 
+0

Merhaba .. Bu çözümü uygulamaya çalıştım. Ancak CanView Çözümleme yöntemi findViewById olsun. Uygulamam neden bu satırda başarısız olursa olsun? –

+0

harika. Ancak, _ActionBarListActivity_ işlemini tamamlamak için _onListItemClick_ uygulamasını içermesi gerekiyor. Ekleyebilir misin? – Sash0k

+0

@ this-Me Orada gerekli tüm ithalat var mı? findViewById, ActionBarActivity öğesinden devralınmıştır, bu nedenle, bu satırla ilgili sorunlar varsa, doğru sınıfın genişletildiğinden emin olun: import android.support.v7.app.ActionBarActivity; –

2

Belki de ActionBarActivity uzantısını genişletmeye çalışabilir ve bu etkinlik için varsayılan düzen için ListView numaralı bir yerleşimi ayarlayın. Böyle

şey:

public class AlarmListActivity extends ActionBarActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.layout_with_list_view); 

     ListView lv = (ListView) findViewById(R.id.listView1); 
     // populate list view 
    } 
} 

ve correcponding düzen dosyası:

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; 
    } 
} 
} 

Aynı normal ListActivity gibi, bir gerekir: Burada

<LinearLayout> 
    <ListView 
     android:id="@+id/listView1"> 
    </ListView> 
</LinearLayout> 
0

yerine XML düzeni oluşturmak yerine, ben kodda yapmaya karar verdik. Dosya a, kodunuzda tek bir düşüştür.

package com.stackoverflow.free.examples; 

import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.LinearLayout; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.TableRow; 
import android.widget.TextView; 

/** 
* based of https://raw.githubusercontent.com/android/platform_frameworks_base/d6c1919779acb042392615637b9007e0c4b89023/core/java/android/app/ListActivity.java 
* Created by elcuco on 5/27/2014. 
*/ 
@SuppressWarnings("UnusedDeclaration") 
public class SupportListActivity extends ActionBarActivity { 
    protected ListAdapter mAdapter; 
    protected ListView mList; 
    protected TextView mEmptyMessage; 

    @Override 
    protected void onCreate(Bundle savedBundle) 
    { 
     super.onCreate(savedBundle); 
     mEmptyMessage = new TextView(this); 
     mEmptyMessage.setText("No results"); 
     mList = new ListView(this); 
     mList.setEmptyView(mEmptyMessage); 
     LinearLayout ll = new LinearLayout(this); 
     ll.addView(mEmptyMessage, TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT); 
     ll.addView(mList, TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT); 
     setContentView(ll); 
    } 

    public void setListAdapter(ListAdapter adapter) { 
     synchronized (this) { 
      mAdapter = adapter; 
      mList.setAdapter(adapter); 
     } 
    } 

    /** 
    * Get the activity's list view widget. 
    */ 
    public ListView getListView() { 
     return mList; 
    } 

    /** 
    * Set the currently selected list item to the specified 
    * position with the adapter's data 
    * 
    * @param position the position on list to select 
    */ 
    public void setSelection(int position) { 
     mList.setSelection(position); 
    } 

    /** 
    * Get the position of the currently selected list item. 
    */ 
    public int getSelectedItemPosition() { 
     return mList.getSelectedItemPosition(); 
    } 

    /** 
    * Get the cursor row ID of the currently selected list item. 
    */ 
    public long getSelectedItemId() { 
     return mList.getSelectedItemId(); 
    } 

    private AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
     { 
      onListItemClick((ListView)parent, v, position, id); 
     } 
    }; 

    /** 
    * This method will be called when an item in the list is selected. 
    * Subclasses should override. Subclasses can call 
    * getListView().getItemAtPosition(position) if they need to access the 
    * data associated with the selected item. 
    * 
    * @param l The ListView where the click happened 
    * @param v The view that was clicked within the ListView 
    * @param position The position of the view in the list 
    * @param id The row id of the item that was clicked 
    */ 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
    } 
} 
0

cevabım accepted one dayalı ve aynı zamanda onListItemClick uygulanmasını içerir. Ancak boş görünüme sahip bir problem var.

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); 
    } 
}; 
} 
0

Bu çözelti @patrick ile accepted solution dayanmaktadır. İşte tam kod:

Önce XML düzen dosyası activity_main.xml. Ben Kimlik entryList

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.MainActivity" > 

    <ListView 
     android:id="@+id/entryList" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" > 
    </ListView> 

</RelativeLayout> 

Sonraki ile bir ListView sahip Bildirimi kendi ActionBarListActivity olduğunu. Bazı değişiklikler farkedeceksiniz. Jenerik ve mümkün olduğunca tekrar kullanılabilir hale getirmek istedim.

package com.example.api; 

import android.support.v7.app.ActionBarActivity; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.HeaderViewListAdapter; 
import android.widget.ListAdapter; 
import android.widget.ListView; 

public abstract class ActionBarListActivity extends ActionBarActivity { 

    private final class ListOnItemClickListener implements OnItemClickListener { 

     public void onItemClick(AdapterView<?> lv, View v, int position, long id) { 
      onListItemClick((ListView) lv, v, position, id); 
      // String str = ((TextView) arg1).getText().toString(); 
      // Toast.makeText(getBaseContext(), str, 
      // Toast.LENGTH_LONG).show(); 
      // Intent intent = new Intent(getBaseContext(), 
      // your_new_Intent.class); 
      // intent.putExtra("list_view_value", str); 
      // startActivity(intent); 
     } 
    } 

    private ListView mListView; 

    protected ListView getListView() { 

     if (mListView == null) { 
      initListView(); 
     } 
     return mListView; 
    } 

    private void initListView() { 
     mListView = (ListView) findViewById(getListViewId()); 
     if (mListView == null) { 
      throw new RuntimeException(
        "ListView cannot be null. Please set a valid ListViewId"); 
     } 

     mListView.setOnItemClickListener(new ListOnItemClickListener()); 
    } 

    protected abstract int getListViewId(); 

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

    protected void onListItemClick(ListView lv, View v, int position, long id) { 
     // No default functionality. To override 
    } 

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

Sonraki, yukarıdaki sınıfı genişleten Ana Kalıcamdır. onListItemClick geçersiz kılarak Temelde

package com.example; 

import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 

import com.example.api.ActionBarListActivity; 

public class MainActivity extends ActionBarListActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     String[] values = new String[] { "Android", "iPhone", "WindowsMobile", 
       "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", 
       "Linux", "OS/2" }; 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, values); 
     setListAdapter(adapter); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     Log.d("click", "Position click " + position); 
     String item = (String) getListAdapter().getItem(position); 
     Toast.makeText(this, item + " selected", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    protected int getListViewId() { 
     return R.id.entryList; 
    } 
} 

,() kullanıcı bir şey kabul ettiğinde ne yapacağını söyleyebiliriz.

Yorumlardaki düşüncelerinizi/sorunlarınızı bize bildirin.

Alkış

0

Ekleme aşağıdaki sınıfınıza kod satırı ve sınıf AdapterView.OnItemClickListener uygular emin olun:

getListView().setOnItemClickListener(this); 
İlgili konular