2012-02-28 79 views
0

我有一些困难,在Android的列表视图,ArrayAdapters和片段,其中充气含有标记导致一个ClassNotFoundException .xml文件ClassNotFoundExceptions。我正在运行Android 4.0.3 FWIW。这是我的主要活动课的样子:Android的 - 列表视图,ArrrayAdapters,片段和

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:

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

我有Android系统的支持,v4.jar在我的项目我的libs文件夹,它是在项目的类路径了。我感觉兼容性包在阅读我在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 2012-03-01 20:51:28

回答

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

喜Gangus - 感谢优化指针,但我不相信这将解决我原来的问题。 if(v == null)检查有用的一个地方是,如果您想使用ViewHolder模式来减少findViewById调用的数量。 http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html有更多的细节。 – seanoshea 2012-04-24 16:15:45