2012-08-08 4 views
2

사용자 지정 ListView를 만들려고합니다. 노트 제목과 각각의 TextView에 노트가 작성된 시간과 날짜가 표시되어야하며 각 노트 제목은 DB. 그래서 나는 그것을 위해 사용자 정의 어댑터를 만들어 :ListView 용 사용자 지정 어댑터

... 
NoteAdapter adapter; 
NotesManager manager; 
private Note nNoteToDelete; 
ArrayList<Note> lstAllNotes; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Setting onClickListener for the "Add note" button when the activity starts 
    findViewById(R.id.btnAddNewNote).setOnClickListener(addNewNote); 

    // INSTANTIATING 

    // Manager - to manage all the DB manipulations 
    manager = new NotesManager(this); 

    // Retrieving all the notes in the DB 
    lstAllNotes = manager.getAllNotes(); 

    // Setting the ArrayAdapter, to display retrieved data in the ListView 
    //adapter = new ArrayAdapter<Note>(this, R.layout.note, lstAllNotes); 
    adapter = new NoteAdapter(this, R.layout.main, R.id.noteTitle, lstAllNotes); 

    // Setting the ListAdapter 
    setListAdapter(adapter); 

    // Registering for a single click action for each item in the ListView 
    getListView().setOnItemClickListener(editNote); 

    // Registering for a long click, which will pop up a context menu 
    registerForContextMenu(getListView()); 

} 
... 

을하지만 응용 프로그램을 테스트 할 때, 즉시 충돌 :

public class NoteAdapter extends ArrayAdapter<Note> { 

public NoteAdapter(Context context, int resource, int textViewResourceId, List<Note> objects) { 
    super(context, resource, textViewResourceId, objects); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // Creating the row 
    View row = super.getView(position, convertView, parent); 

    // Changing the text of time and date 
    ((TextView)row.findViewById(R.id.noteTitle)).setText(getItem(position).getTitle()); 
    ((TextView)row.findViewById(R.id.noteTime)).setText(getItem(position).getTime()); 
    ((TextView)row.findViewById(R.id.noteDate)).setText(getItem(position).getDate()); 

    ((TextView)row.findViewById(R.id.noteTitle)).setTextColor(Color.parseColor(getItem(position).getColor())); 

    // Returning the row 
    return row; 
    } 
} 

그리고 주요 활동이 내가 그것을 구현하는 방법이다

. LogCat에서 이러한 오류가 발생합니다.

08-08 08:59:52.291: E/AndroidRuntime(21268): FATAL EXCEPTION: main 
08-08 08:59:52.291: E/AndroidRuntime(21268): java.lang.NullPointerException 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:394) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at com.notepad.NoteAdapter.getView(NoteAdapter.java:24) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.widget.AbsListView.obtainView(AbsListView.java:2267) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.widget.ListView.measureHeightOfChildren(ListView.java:1244) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.widget.ListView.onMeasure(ListView.java:1156) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.View.measure(View.java:15172) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.widget.LinearLayout.measureVertical(LinearLayout.java:681) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.View.measure(View.java:15172) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.View.measure(View.java:15172) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.widget.LinearLayout.measureVertical(LinearLayout.java:833) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.View.measure(View.java:15172) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4814) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2148) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.View.measure(View.java:15172) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1848) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1100) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1273) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.Choreographer.doFrame(Choreographer.java:525) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.os.Handler.handleCallback(Handler.java:615) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.os.Looper.loop(Looper.java:137) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at android.app.ActivityThread.main(ActivityThread.java:4745) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at java.lang.reflect.Method.invokeNative(Native Method) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at java.lang.reflect.Method.invoke(Method.java:511) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
08-08 08:59:52.291: E/AndroidRuntime(21268): at dalvik.system.NativeStart.main(Native Method) 

무엇이 여기에 있습니까? 왜 계속 충돌을 일으키고 어떻게 수정합니까?

+0

라인 (24)에 NoteAdapter에 무엇입니까? –

+0

ViewHolder 사용 (이 예제 참조) (http://samir-mangroliya.blogspot.in/p/android-customized-listview.html) –

+0

@iulia이 부분은 다음과 같습니다. View row = super.getView (position, convertView, 부모); ' – Igal

답변

1

이 시도 :

public class NoteAdapter extends ArrayAdapter<Note> { 

    LayoutInflater mInflater; 
    List<Note> list; 
    public NoteAdapter(Context context, int resource, int textViewResourceId, List<Note> objects) { 
     super(context, resource, textViewResourceId, objects); 
     mInflater=LayoutInflater.from(context); 
     list=objects; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     final ViewHolder holder; 

     if(convertView==null){ 
      convertView=mInflater.inflate(R.layout.listitem_layout,null);// R.layout.listitem_layout is your custom layout file 
      holder=new ViewHolder(); 

      holder.title=(TextView)convertView.findViewById(R.id.noteTitle); 
      holder.time=(TextView)convertView.findViewById(R.id.noteTime); 
      holder.date=(TextView)convertView.findViewById(R.id.noteDate); 
      convertView.setTag(holder); 
     } 
     else{ 
      holder=(ViewHolder)convertView.getTag(); 
     } 

     Note note=list.get(position); 

     holder.title.setText(note.getTitle()); 
     holder.title.setTextColor(Color.parseColor(note.getColor())); 
     holder.time.setText(note.getTime()); 
     holder.date.setText(note.getDate());  

     return convertView; 
    } 
    class ViewHolder{ 
     TextView title; 
     TextView time; 
     TextView date; 
    } 
} 
+0

시도해 보았습니다! 대단히 감사합니다 !! 이제 XML에 대한 트위크를 만들어야합니다 ... – Igal

+0

도와 줘서 기뻐요! :) – Hiral

4

당신은 당신의 getView() 사용자 정의 어댑터에서보기를 팽창하지 않습니다는

당신이하고있는 일이

// Creating the row 
View row = super.getView(position, convertView, parent); 

하는 row.xml 레이아웃 파일이 될 것이다 이런 일을 어떻게하려고 옳지 않다 레이아웃 폴더

LayoutInflater inflater=LayoutInflater.from(context); 
View row=inflater.inflate(R.layout.row, parent, false); 

여기서 context는 생성자에서 초기화 된 Context 유형의 로컬 변수입니다.

+0

다음과 같이 구현하려고합니다 :'LayoutInflater inflater = getLayoutInflater(); \t \t 행보기 = inflater.inflate (R.layout.note, parent, false);'이제이 오류 메시지가 나타납니다.'메소드 getLayoutInflater()가 NoteAdapter 유형에 대해 정의되지 않았습니다.이 메소드를 생성해야합니까? 방법? – Igal

+0

내 편집을 확인하지 못했습니다. 무엇이 누락 되었습니까? ie.LayoutInflater.from (컨텍스트); – Akram

+0

시도했지만 컨텍스트 변수를 인스턴스화 할 수 없습니다 ... : -/여전히 도움을 주셔서 감사합니다! 매우 감사! – Igal

관련 문제