2012-02-28 15 views
0

AndroidのListView、ArrayAdapters、Fragmentsで問題が発生しています。タグを含む.xmlファイルを膨張させると、ClassNotFoundExceptionが発生します。私はAndroid 4.0.3 FWIWを実行しています。Android - ListViews、ArrrayAdapters、Fragments、ClassNotFoundExceptions

public class MarketActivity extends FragmentActivity implements OnClickListener { 

private ListView marketListView; 

private MarketAdapter adapter; 

@Override 
protected void onStart() { 
    super.onStart(); 
    setContentView(R.layout.market); 
    marketListView = (ListView) findViewById(R.id.market_list_view); 
    updateView(); 
} 

private void updateView() { 
    BfMarket market = ((MarketController) getController()).getMarket(); 
    BfRunner runners = market.getRunners(); 

    if (adapter == null) { 
     adapter = new MarketAdapter(this, R.layout.market_row, runners.getRunners()); 
    } 
    if (marketListView != null && runners != null) { 
     marketListView.setAdapter(adapter); 
     marketListView.setTextFilterEnabled(true); 
     adapter.setRunners(runners.getRunners()); 
     adapter.notifyDataSetChanged(); 
    } 

MarketActivityためのレイアウトファイル(R.layout.market)は、このようなリストビューが含まれています:

<ListView 
    android:id="@+id/market_list_view" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:cacheColorHint="@android:color/transparent" > 
</ListView> 

MarketAdapterクラスは、単純なArrayAdapterであるここに私のメインアクティビティクラスは次のようになります。次のようになります。

コードは、次の点で失敗
public class MarketAdapter extends ArrayAdapter<Runner> { 

private static final String LOG_TAG = "MarketAdapter"; 

private ArrayList<Runner> runners; 
private BfMarket market; 

public MarketAdapter(Context context, int textViewResourceId, ArrayList<Runner> runners) { 
    super(context, textViewResourceId, runners); 
    this.runners = runners; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater vi = (LayoutInflater) getSystemService(
       Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.market_row, parent, false); 
    } 
    MarketRunner runner = (MarketRunner) runners.get(position); 

v = vi.inflate(R.layout.market_row, parent, false); 

market_rowは(私はすべての問題を引き起こしていると思います)、次のタグがあります。

<fragment class="com.my.app.DummyFragment" 
     android:id="@+id/embedded" 
     android:layout_width="0px" android:layout_height="wrap_content" 
     android:layout_weight="1" /> 

私DummyFragmentは非常に簡単です:

public class DummyFragment extends Fragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_dummy, container, false); 
} 

}

トラブルシューティングの物事のカップルすでに試したことがあります:

私のMarketActivityが参照していたことを確認しました正しいサポートAPI。ここで私が持っているインポートは私のMarketActivityクラスの最上部にあります:

import android.support.v4.app.FragmentActivity; 

私は私のプロジェクトの私のlibsフォルダにアンドロイド・サポート・v4.jarを持っており、それがあまりにもプロジェクトのクラスパス上にあります。私は、market_row.xmlで宣言したタグで互換性パッケージが読み込みが難しいと感じています。フラグメントタグに関連付けられたクラスが見つからないか、不適切なLayoutInflaterを使用していますか?すべての提案は大歓迎です。

おかげで、

ショーン

java.lang.RuntimeException: Unable to start activity ComponentInfo{}: android.view.InflateException: Binary XML file line #51: Error inflating class fragment 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1777) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1793) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:123) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:123) 
    at android.app.ActivityThread.main(ActivityThread.java:3848) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
    at dalvik.system.NativeStart.main(Native Method) 

Caused by: android.view.InflateException: Binary XML file line #51: Error inflating class fragment 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:581) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:623) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:408) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:211) 
    at android.app.Activity.setContentView(Activity.java:1657) 
    at com.test.base.activities.TabbedStoreActivity.onCreate(TabbedStoreActivity.java:46) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1731) 
+0

スタックトレースは次のとおりです: – seanoshea

答えて

0

全作品:

View v = convertView; 
if (v == null) { 
    LayoutInflater vi = (LayoutInflater) getSystemService(
      Context.LAYOUT_INFLATER_SERVICE); 
    v = vi.inflate(R.layout.market_row, parent, false); 
} 

が過剰です。新しいArrayAdapterを作成するときに、すでにアイテムレイアウトを設定していました。それを覚えて、アイテムを作成するすべての作業を行い、必要なときにのみ行います。

ルックhere

+0

こんにちはガンクス - 最適化ポインタのおかげで、私はそれが私の元の質問を解決するか分からない。 if(v == null)チェックが便利なのは、ViewHolderパターンを使用してfindViewById呼び出しの数を減らす場合です。これについての詳細はhttp://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.htmlをご覧ください。 – seanoshea

関連する問題