2013-04-21 3 views
2

이 내 처음 사용 ListFragments 나는 오류로 실행 해요된다. 제 질문은이 코드 줄에 빨간색 선이 표시되는 이유입니다.안드로이드 ListFragment 오류는

setListAdapter(new ArrayAdapter<String>(getActivity(), 
      android.R.layout.simple_list_item_1, model.getIncidents())); 

The constructor ArrayAdapter<String>(Activity, int, ArrayList<Incident>) is undefined

편집

내가 더 이상이 조각에 대해 위의 오류가 없다고 말합니다. 코드를 약간 변경했는데 이제 다음과 같이 보입니다.

public class Incidents_Frag extends ListFragment { 
View view; 
public static Model model; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) {   
    view = inflater.inflate(R.layout.incid, container, false); 
    model = new Model(); 
    setListAdapter(new ArrayAdapter<Incident>(getActivity(), 
      android.R.layout.simple_list_item_1, model.getIncidents()));   
    return view; 
} 
} 

그러나 이제 런타임 오류가 발생합니다. logcat은 다음과 같습니다

04-21 18:47:40.934: E/AndroidRuntime(806): FATAL EXCEPTION: main 
04-21 18:47:40.934: E/AndroidRuntime(806): java.lang.RuntimeException: Content has view with id attribute 'android.R.id.list' that is not a ListView class 
04-21 18:47:40.934: E/AndroidRuntime(806): at android.app.ListFragment.ensureList(ListFragment.java:402) 
04-21 18:47:40.934: E/AndroidRuntime(806): at android.app.ListFragment.onViewCreated(ListFragment.java:203) 
04-21 18:47:40.934: E/AndroidRuntime(806): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:809) 
04-21 18:47:40.934: E/AndroidRuntime(806): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:998) 
04-21 18:47:40.934: E/AndroidRuntime(806): at android.app.BackStackRecord.run(BackStackRecord.java:622) 
04-21 18:47:40.934: E/AndroidRuntime(806): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1330) 
04-21 18:47:40.934: E/AndroidRuntime(806): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:417) 
04-21 18:47:40.934: E/AndroidRuntime(806): at android.os.Handler.handleCallback(Handler.java:605) 
04-21 18:47:40.934: E/AndroidRuntime(806): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-21 18:47:40.934: E/AndroidRuntime(806): at android.os.Looper.loop(Looper.java:137) 
04-21 18:47:40.934: E/AndroidRuntime(806): at android.app.ActivityThread.main(ActivityThread.java:4340) 
04-21 18:47:40.934: E/AndroidRuntime(806): at java.lang.reflect.Method.invokeNative(Native Method) 
04-21 18:47:40.934: E/AndroidRuntime(806): at java.lang.reflect.Method.invoke(Method.java:511) 
04-21 18:47:40.934: E/AndroidRuntime(806): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
04-21 18:47:40.934: E/AndroidRuntime(806): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
04-21 18:47:40.934: E/AndroidRuntime(806): at dalvik.system.NativeStart.main(Native Method) 

제가 처음으로 이야기 한 내용을 이해할 수는 없습니다. 어느 R.id 파일 이름이 list으로 표시되지 않습니다. 나는 이제 어딘가에 listview 나 textview를 넣을 필요가 있다고 생각한다. 어떤을위한 덕분에 여기

public class Incidents_Frag extends ListFragment { 
View view; 
public static Model model; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) {   
    view = inflater.inflate(R.layout.incid, container, false); 
    model = new Model(); 
    setListAdapter(new ArrayAdapter<Incident>(getActivity(), 
      android.R.layout.simple_list_item_1, model.getIncidents()));   
    return view; 
} 

public class MyArrayAdapter extends ArrayAdapter<Item> { 
    ArrayList<Incident> items; 
    Context context; 
    public MyArrayAdapter(Context context, int textViewResourceId, 
      ArrayList<Incident> items) { 
     super(context, textViewResourceId, items); 

     this.context = context; 
     this.items = items; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     View row = convertView; 
     ViewHolder holder = new ViewHolder(); 
     Item item = items.get(position); 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(R.layout.list_item, parent, false); 
      holder.userName = (TextView) row.findViewById(R.id.name); 
      row.setTag(holder); 
     } 
     else 
     { 
      holder = (ViewHolder) row.getTag(); 
     } 

     holder.name.setText(item.getName()); 
     return row; 
    } 

    public static class ViewHolder 
    { 
     TextView name; 
    } 

    public int getCount() { 
     return items.size(); 
    } 

} 
} 

내가 Item item = items.get(position);

holder.userName = (TextView) row.findViewById(R.id.name);
에서 레드 라인을 얻을 내 조각에 대한 새로운 코드는

편집을 제공 할 수있는 도움 "userName은 (는) "

holder.name.setText(item.getName());
"있어서 getName()가 입력 ClipData.Item "

public static class ViewHolder
"멤버 형 ViewHolder 정적 선언 될 수 없기 정의되지 해결; 정적 유형은 정적 또는 최상위 수준 유형에서만 선언 할 수 있습니다. "

이렇게 빨간색 선을 정리하면 작동하거나 작동하지 않을 수 있습니다.이 경로를 계속 진행하려면이 코드 . 당신은 따라서 그 오류를 "사건"의 배열을 통과 할 수있는 적절한 장소에, 어떤이 기본 생성자는 문자열의 배열을 받아

+1

는'ArrayAdapter'는 형식화 된 클래스입니다. –

+0

@MH 수정 사항을 참조하십시오 – IrishWhiskey

+1

새로운 문제에 대해 : 레이아웃 파일을 변경 한 경우'@ android' 네임 스페이스 내의 ID를 검색하십시오. 특히'@android : id/list'와 같은 이드의 모습을주의 깊게 관찰하십시오. 오류는'ListFragment'가 레이아웃 파일의'ListView '를 식별하는 데 사용하는 ID를 일부보기에 부여했다는 것을 나타냅니다. 'R.layout.incid' (incid.xml)에서 검색을 시작할 것입니다. –

답변

2

수행 할 필요성을 편집합니다.

을 당신은 자신을 구현해야합니다 그 ArrayAdapter와 개체 유형 "사건"의 배열을 받아들입니다.

샘플은 ArrayAdapter와 솜을 볼 것이다 연장 이런 식으로.

public class MyArrayAdapter extends ArrayAdapter<Incident> { // changed from Item to Incident 
    ArrayList<Incident> items; 
    Context context; 
    public MyArrayAdapter(Context context, int textViewResourceId, 
      ArrayList<Incident> items) { 
     super(context, textViewResourceId, items); 

     this.context = context; 
     this.items = items; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     View row = convertView; 
     ViewHolder holder = new ViewHolder(); 
     Incident item = items.get(position); // item is your accident 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(R.layout.list_item, parent, false); 
      holder.name = (TextView) row.findViewById(R.id.name); // updated it is name from holder class 
      row.setTag(holder); 
     } 
     else 
     { 
      holder = (ViewHolder) row.getTag(); 
     } 

     holder.name.setText(item.getName()); // this is just example item is your Incident, you have to get it's name function whatever that is in your class 
     return row; 
    } 

    public static class ViewHolder 
    { 
     TextView name; 
    } 

    public int getCount() { 
     return items.size(); 
    } 

} 

이 경우 자신 만의 레이아웃을 만들어야합니다. 위의 예에서는 list_item.xml을 만들고 ID 이름이있는 TextView를 하나만 추가하면됩니다. `새로운 ArrayAdapter와 (...)``Incident` 개체의 목록을 받아들이는 생성자 위해서는, 당신은 전화를해야합니다 있도록

+0

사용자 지정 어댑터를 만들려고 할 때 더 많은 오류와 일부 코드로 인해 완전히 이해하지 못했습니다. 그래도 고마워. 수정 된 게시물을 확인하십시오. 제대로 된 것 같습니다. 약간의 안내가 필요합니다. – IrishWhiskey

+0

기본 어댑터가 사용자의 Incident 개체를 인식하지 못합니다. 문자열 만 허용합니다. 자신의 어댑터를 만들어야합니다. 위 코드를 사용하여 새 코드 및 오류로 질문을 업데이트하십시오. 효과가있을 것입니다. – Sharj

+0

새로운 조각 코드로 업데이트되었습니다. 내 코드에 빨간 선이 꽤 많아서 – IrishWhiskey