2013-08-26 4 views
0

ListFragment를 사용하여 소유자 목록을 표시하는 클래스가 있습니다. 사용자가 소유자를 클릭하면 소유자의 차를 나열 할 새로운 조각으로 하단 조각을 대체해야합니다. 문제는 계속 예외를 던지고 있다는 것입니다. 뷰를 만들었지 만 id 0x7f090013에 대한 뷰가 없습니다. 여기서 내가 뭘 잘못하고 있니?ListFragment 관련 문제 데이터 표시

이 내가 (전체 코드가 마지막에 게시됩니다.)

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    //super.onListItemClick(l, v, position, id); 
    int search = 0; 
    Owner a = (Owner) getListView().getItemAtPosition(position); 
    String name = a.getFirstName(); 
    String lName = a.getLastName(); 
    String Id = a.getCarId(); 

    FragmentManager mFragment = getChildFragmentManager(); 
    FragmentTransaction ft = mFragment.beginTransaction(); 
    CarDetail cDetail = new CarDetail(); 
    cDetail.SearchParameters(Integer.parseInt(Id)); 
    ft.replace(R.id.fCarDetail, cDetail); 
    ft.addToBackStack(null); 
    ft.commit();  
} 

가 //이 차의 상세 조각

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class CarDetail extends ListFragment { 
    private ListView lCars; 
    private ArrayList<Car> listCar = new ArrayList<Car>(); 
    private CarAdapter carAdapter; 
    private int carId = 0; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v1 = inflater.inflate(R.layout.customize_layout,container,false); 
     lCars = (ListView) v1.findViewById(android.R.id.list); 
     return v1; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     lCars.setAdapter(carAdapter); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     carAdapter = new CarAdapter(getActivity(), R.layout.car_detail, listCar); 
     if(carId > 0) 
     { 
      new CarAsyncTask(carId).execute(); 
        //As soon as it done with the on create, it throw the exception. 
     } 
    } 

    public void SearchParameters(int id) { 
     carId = id; 
    } 




    private class CarAsyncTask extends AsyncTask<Integer, Void, List<Car>> { 
     public int id =0; 


     public CarAsyncTask(int carId) { 
      id = carId; 
     } 

     @Override 
     protected List<Car> doInBackground(Integer... params) { 
      //List<Car> item = null; 
      List<Car> item = new ArrayList<Car>(); 
      item.add(new Car("Chevy","Caprice","2002", 1)); 
      item.add(new Car("Chevy","Malibu","2014", 2)); 
      item.add(new Car("Dodge","Stratus","2002", 3)); 
      item.add(new Car("Saturn","L300","2004", 4)); 

      return item; 
     } 



     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 
      listCar.clear(); 
      carAdapter.clear(); 

     } 

     @Override 
     protected void onPostExecute(List<Car> result) { 
      super.onPostExecute(result); 
      for(Car c: result) 
      { 
       if(c.getID() == carId) 
       { 
        carAdapter.add(c); 
        carAdapter.notifyDataSetChanged(); 
       } 
      } 
     } 

    } 

} 
있는 다른 조각을 대체하기 위해 호출하고있는 onListItemClick입니다 //

//car_detail.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/tvMake" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="test" /> 

    <TextView 
     android:id="@+id/tvModel" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="make" /> 

    <TextView 
     android:id="@+id/tvYear" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="year" /> 

    <TextView 
     android:id="@+id/tvID" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="ID" /> 

</LinearLayout> 
//the customize layout 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:paddingLeft="8dp" 
     android:paddingRight="8dp"> 

    <ListView android:id="@id/android:list" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_weight="1" 
       android:background="#FFFF00" 
       android:drawSelectorOnTop="false"/> 

    <TextView android:id="@id/android:empty" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:background="#FF00FF" 
       android:text="No data"/> 
</LinearLayout> 
Exception: 

08-22 21:00:21.051: E/AndroidRuntime(907): FATAL EXCEPTION: main 
08-22 21:00:21.051: E/AndroidRuntime(907): java.lang.IllegalArgumentException: No view found for id 0x7f090013 (com.mb.carlovers:id/fCarDetail) for fragment CarDetail{40d97200 #0 id=0x7f090013} 
08-22 21:00:21.051: E/AndroidRuntime(907): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:919) 
08-22 21:00:21.051: E/AndroidRuntime(907): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 
08-22 21:00:21.051: E/AndroidRuntime(907): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
08-22 21:00:21.051: E/AndroidRuntime(907): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) 
08-22 21:00:21.051: E/AndroidRuntime(907): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440) 
08-22 21:00:21.051: E/AndroidRuntime(907): at android.os.Handler.handleCallback(Handler.java:725) 
08-22 21:00:21.051: E/AndroidRuntime(907): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-22 21:00:21.051: E/AndroidRuntime(907): at android.os.Looper.loop(Looper.java:137) 
08-22 21:00:21.051: E/AndroidRuntime(907): at android.app.ActivityThread.main(ActivityThread.java:5041) 
08-22 21:00:21.051: E/AndroidRuntime(907): at java.lang.reflect.Method.invokeNative(Native Method) 
08-22 21:00:21.051: E/AndroidRuntime(907): at java.lang.reflect.Method.invoke(Method.java:511) 
08-22 21:00:21.051: E/AndroidRuntime(907): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
08-22 21:00:21.051: E/AndroidRuntime(907): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
08-22 21:00:21.051: E/AndroidRuntime(907): at dalvik.system.NativeStart.main(Native Method) 
08-22 21:00:21.172: W/ActivityManager(290): Force finishing activity com.mb.carlovers/.People 
08-22 21:00:21.231: W/WindowManager(290): Failure taking screenshot for (237x148) to layer 21015 
08-22 21:00:21.631: E/SurfaceFlinger(37): ro.sf.lcd_density must be defined as a build property 
08-22 21:00:21.751: W/ActivityManager(290): Activity pause timeout for ActivityRecord{40f05be8 u0 com.mb.carlovers/.People} 
08-22 21:00:21.821: D/dalvikvm(290): GC_CONCURRENT freed 752K, 18% free 5916K/7192K, paused 74ms+104ms, total 515ms 
08-22 21:00:31.265: W/ActivityManager(290): Launch timeout has expired, giving up 

// 아래에있는 OwnerDetail 코드

package com.mb.carlovers; 
import java.util.ArrayList; 
import java.util.List; 

import com.mb.carlovers.adapter.OwnerAdapter; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.app.ListFragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 

public class OwnerDetail extends ListFragment { 
    private ListView mListView; 
    private ArrayList<Owner> listItem = new ArrayList<Owner>(); 
    private OwnerAdapter ownerAdapter; 
    private String[] searchParameter = null; 

    public void SearchParameters(String[] parameters) 
    { 
     searchParameter = parameters; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
     View v1 = inflater.inflate(R.layout.customize_layout,container, false); 
     mListView = (ListView) v1.findViewById(android.R.id.list); 
     return v1; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) 
    { 
     super.onActivityCreated(savedInstanceState); 
     mListView.setAdapter(ownerAdapter); 
     // ownerAdapter.notifyDataSetChanged(); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ownerAdapter = new OwnerAdapter(getActivity(), R.layout.owner_detail, listItem); 
     if(!(searchParameter == null)) 
     { 
      //ownerAdapter.clear(); 
     // ownerAdapter.addAll(listItem); 
      new OnwerAsyncTask().execute(); 
      //ownerAdapter.notifyDataSetChanged(); 
     } 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     // TODO Auto-generated method stub 
     //super.onListItemClick(l, v, position, id); 
     int search = 0; 
     Owner a = (Owner) getListView().getItemAtPosition(position); 
     String name = a.getFirstName(); 
     String lName = a.getLastName(); 
     String Id = a.getCarId(); 

     FragmentManager mFragment = getChildFragmentManager(); 
     FragmentTransaction ft = mFragment.beginTransaction(); 
     CarDetail cDetail = new CarDetail(); 
     cDetail.SearchParameters(Integer.parseInt(Id)); 
     ft.replace(R.id.fCarDetail, cDetail); 
     ft.addToBackStack(null); 
     ft.commit();  
    } 


    private class OnwerAsyncTask extends AsyncTask<Void, Void, List<Owner>> { 
     @Override 
     protected List<Owner> doInBackground(Void... params) { 
      ArrayList<Owner> listItemLocal = new ArrayList<Owner>(); 
      try 
      { 
       Owner items = new Owner(); 
       items.setFirstName("John"); 
       items.setLastName("Smith"); 
       items.setCarId("1"); 
       listItemLocal.add(items); 

       Owner item1 = new Owner(); 
       item1.setFirstName("Samantha"); 
       item1.setLastName("Right"); 
       item1.setCarId("2"); 
       listItemLocal.add(item1); 

       Owner item2 = new Owner(); 
       item2.setFirstName("Regie"); 
       item2.setLastName("Miller"); 
       item2.setCarId("3"); 
       listItemLocal.add(item2); 

       Owner item3 = new Owner(); 
       item3.setFirstName("Mark"); 
       item3.setLastName("Adam"); 
       item3.setCarId("4"); 
       listItemLocal.add(item3); 


      } catch(Exception ex) 
      { 
       ex.toString(); 
      } 
      return listItemLocal; 
     } 



     @Override 
     protected void onPreExecute() { 
      listItem.clear(); 
      ownerAdapter.clear(); 
      super.onPreExecute(); 
     } 



     @Override 
     protected void onPostExecute(List<Owner> result) { 
      /*OwnerDetail fragment = (OwnerDetail) mActivity.getSupportFragmentManager().findFragmentById(R.id.fOwnerDetail); 
      fragment.SetAdapter(result);*/ 
      listItem = (ArrayList<Owner>) result; 
      super.onPostExecute(result); 
      if(listItem.size() > 0) 
      { 
       ownerAdapter.clear(); 
       ownerAdapter.addAll(listItem); 
       ownerAdapter.notifyDataSetChanged(); 
       Log.i("Testing", "Added " + result.size() + "items to adapter."); 
      } 
     } 

    } 
} 

답변

0

응용 프로그램을 계속해서 디버깅 한 후 마침내 문제가 발견되었습니다. car 클래스에서 carId는 정수로 선언되었습니다. 그러나, 나는 CarAdapter에서 문자열로 변환하지 않고 정수를 전달하는 set ID를 호출합니다. ID를 문자열로 변경하고 ID 비교를 수행하기 전에이를 다시 정수로 변환합니다. 그것은 작동합니다.

//the piece of code below was causing the issue. 
holder.tvId.setText(item.getID());