1

저는 교회의 Android 앱을 쓰고 있습니다. ListView를 런치 패드로 사용하여 설교를 온라인으로 보려고합니다. LV가 올바르게 채워지지만 각 목록 항목에는 커서로 채워지지 않은 두 개의 TextView가 있습니다. 각 목록 항목에는 텍스트가 동일합니다. (그들은 "오디오 재생"과 "비디오 재생"을 정확하게 말합니다.) 각각의 TextView를 클릭하고 특정 웹 페이지로 보낼 수있는 방법이 필요했습니다. 각 TextView에 태그를 추가하려하지만 ViewBinder에서 태그에 액세스하려고하면 NullPointerException이 발생합니다. 태그에는 모두 다른 값이 있습니다.ListView의 TextView에 태그를 추가 하시겠습니까?

이 정적 TextViews에 태그를 할당하는 방법을 아는 사람이 있습니까?

SermonActivity.java

public class SermonActivity extends SherlockListActivity implements 
     OnClickListener, ViewBinder { 

    private Cursor cursor = null; 
    private SimpleCursorAdapter adapter = null; 
    private dbAdapter dba = null; 
    private ListView listView = null; 

    // Arrays 
    private static String[] FROM = { "title", "scripture", "speaker", "mdy", 
      "hour" }; 
    private static int[] TO = { R.id.sermon_title, R.id.sermon_scripture, 
      R.id.sermon_speaker, R.id.sermon_date, R.id.sermon_time }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_sermon); 

     ActionBar actionBar = getSupportActionBar(); 

     // Makes home button visible 
     actionBar.setHomeButtonEnabled(true); 

     // Allows home button to be used to navigate up 
     actionBar.setDisplayHomeAsUpEnabled(true); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onPause(); 
     dba.close(); 
     cursor.close(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     // Setting up the database adapter 
     dba = new dbAdapter(this); 
     dba.open(); 

     // Getting the Cursor of the requested data 
     cursor = dba.read("sermons", null, null); 
     adapter = new SimpleCursorAdapter(this, R.layout.sermon_list, cursor, 
       FROM, TO, 0); 
     adapter.setViewBinder(this); 
     setListAdapter(adapter); 
     setTitle(R.string.title_activity_sermon); 
    } 

    /* 
    * To dynamically change the time of day displayed as well as adding the 
    * title and file tags to the play buttons 
    */ 
    @Override 
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 

     // To set the sermon time 
     if (view.getId() == R.id.sermon_time) { 
      String time = cursor.getString(cursor.getColumnIndex("hour")); 

      if (time.contains("AM")) { 
       ((TextView) view).setText("Sunday AM"); 
      } else if (time.contains("PM")) { 
       ((TextView) view).setText("Sunday PM"); 
      } 

      // Adding tags for the title and file name to the "Play audio/video" 
      // buttons 
      ***TextView playAudio = (TextView) findViewById(R.id.sermon_audio);*** //This is the line that throws the NullPointerException 
      playAudio.setTag(R.string.file_tag, 
        cursor.getString(cursor.getColumnIndex("file"))); 
      playAudio.setTag(R.string.title_tag, 
        cursor.getString(cursor.getColumnIndex("title"))); 

      TextView playVideo = (TextView) findViewById(R.id.sermon_video); 
      playVideo.setTag(R.string.file_tag, 
        cursor.getString(cursor.getColumnIndex("file"))); 
      playVideo.setTag(R.string.title_tag, 
        cursor.getString(cursor.getColumnIndex("title"))); 

      return true; 
     } 

     else { 
      return false; 
     } 
    } 

    @Override 
    public void onClick(View view) { 
     int id = view.getId(); 

     // Starting WebActivity with needed data values 
     if (id == R.id.sermon_audio || id == R.id.sermon_video) { 

      Intent intent = new Intent(this, WebActivity.class); 
      intent.putExtra("file", (String) view.getTag(R.string.file_tag)); 
      intent.putExtra("title", (String) view.getTag(R.string.title_tag)); 

      String type = null; 

      if (id == R.id.sermon_audio) { 
       type = "audio"; 
      } else if (id == R.id.sermon_video) { 
       type = "video"; 
      } 

      intent.putExtra("type", type); 
      startActivity(intent); 
     } 
    } 
} 

sermon_list.xml

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

    <ImageView 
     android:id="@+id/sermon_thumbnail" 
     style="@style/Thumbnail" 
     android:src="@drawable/sermon" /> 

    <TextView 
     android:id="@+id/sermon_audio" 
     style="@style/FeedBody" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/sermon_speaker" 
     android:layout_marginTop="15dp" 
     android:clickable="true" 
     android:onClick="onClick" 
     android:paddingLeft="25dp" 
     android:text="Play audio" 
     android:textColor="@color/link" /> 

    <TextView 
     android:id="@+id/sermon_video" 
     style="@style/FeedBody" 
     android:layout_alignBaseline="@+id/sermon_audio" 
     android:layout_alignBottom="@+id/sermon_audio" 
     android:layout_alignParentRight="true" 
     android:clickable="true" 
     android:onClick="onClick" 
     android:paddingRight="25dp" 
     android:text="Play video" 
     android:textColor="@color/link" /> 

     <TextView 
      android:id="@+id/sermon_title" 
      style="@style/FeedTitle" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_toRightOf="@id/sermon_thumbnail" 
      android:lines="2" 
      android:scrollHorizontally="false" 
      android:singleLine="false" 
      android:width="0dip" /> 

    <TextView 
     android:id="@+id/sermon_scripture" 
     style="@style/FeedBody" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/sermon_thumbnail" 
     android:paddingLeft="3dp" 
     android:text="Scripture" /> 

    <TextView 
     android:id="@+id/sermon_speaker" 
     style="@style/FeedBody" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/sermon_scripture" 
     android:paddingLeft="3dp" 
     android:text="Speaker" /> 

    <TextView 
     android:id="@+id/sermon_time" 
     style="@style/FeedBody" 
     android:layout_alignBaseline="@+id/sermon_speaker" 
     android:layout_alignBottom="@+id/sermon_speaker" 
     android:layout_alignParentRight="true" 
     android:paddingRight="3dp" 
     android:paddingTop="5dp" 
     android:text="Time" /> 

    <TextView 
     android:id="@+id/sermon_date" 
     style="@style/FeedBody" 
     android:layout_alignBaseline="@+id/sermon_scripture" 
     android:layout_alignBottom="@+id/sermon_scripture" 
     android:layout_alignParentRight="true" 
     android:paddingRight="3dp" 
     android:text="Date" /> 

</RelativeLayout> 

스택 추적

03-19 17:17:45.942: W/ActivityThread(21858): Application com.lakesidebaptist.lakesidelife is waiting for the debugger on port 8100... 
03-19 17:17:45.958: I/System.out(21858): Sending WAIT chunk 
03-19 17:17:45.965: I/dalvikvm(21858): Debugger is active 
03-19 17:17:46.161: I/System.out(21858): Debugger has connected 
03-19 17:17:46.161: I/System.out(21858): waiting for debugger to settle... 
03-19 17:17:46.364: I/System.out(21858): waiting for debugger to settle... 
03-19 17:17:46.559: I/System.out(21858): waiting for debugger to settle... 
03-19 17:17:46.762: I/System.out(21858): waiting for debugger to settle... 
03-19 17:17:46.965: I/System.out(21858): waiting for debugger to settle... 
03-19 17:17:47.161: I/System.out(21858): waiting for debugger to settle... 
03-19 17:17:47.364: I/System.out(21858): debugger has settled (1300) 
03-19 17:17:47.794: D/dalvikvm(21858): GC_CONCURRENT freed 186K, 3% free 10996K/11271K, paused 13ms+12ms, total 37ms 
03-19 17:17:47.981: D/libEGL(21858): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so 
03-19 17:17:47.981: D/libEGL(21858): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so 
03-19 17:17:47.981: D/libEGL(21858): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so 
03-19 17:17:48.036: D/OpenGLRenderer(21858): Enabling debug mode 0 
03-19 17:17:51.848: D/dalvikvm(21858): GC_CONCURRENT freed 230K, 3% free 11206K/11527K, paused 14ms+13ms, total 54ms 
03-19 17:17:51.903: I/none(21858): SELECT * FROM 'sermons'; 
03-19 17:17:51.903: I/none(21858): 20 
03-19 17:17:55.731: D/dalvikvm(21858): Debugger has detached; object registry had 995 entries 
03-19 17:17:55.731: D/AndroidRuntime(21858): Shutting down VM 
03-19 17:17:55.731: W/dalvikvm(21858): threadid=1: thread exiting with uncaught exception (group=0x4182e300) 
03-19 17:17:55.747: E/AndroidRuntime(21858): FATAL EXCEPTION: main 
03-19 17:17:55.747: E/AndroidRuntime(21858): java.lang.NullPointerException 
03-19 17:17:55.747: E/AndroidRuntime(21858): at com.lakesidebaptist.lakesidelife.ui.Content.SermonActivity.setViewValue(SermonActivity.java:90) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.support.v4.widget.SimpleCursorAdapter.bindView(SimpleCursorAdapter.java:131) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.support.v4.widget.CursorAdapter.getView(CursorAdapter.java:256) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.widget.AbsListView.obtainView(AbsListView.java:2267) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.widget.ListView.makeAndAddView(ListView.java:1769) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.widget.ListView.fillDown(ListView.java:672) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.widget.ListView.fillFromTop(ListView.java:733) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.widget.ListView.layoutChildren(ListView.java:1622) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.widget.AbsListView.onLayout(AbsListView.java:2102) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.View.layout(View.java:13754) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.ViewGroup.layout(ViewGroup.java:4362) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.View.layout(View.java:13754) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.ViewGroup.layout(ViewGroup.java:4362) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.View.layout(View.java:13754) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.ViewGroup.layout(ViewGroup.java:4362) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.widget.LinearLayout.onLayout(LinearLayout.java:1420) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.View.layout(View.java:13754) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.ViewGroup.layout(ViewGroup.java:4362) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.View.layout(View.java:13754) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.ViewGroup.layout(ViewGroup.java:4362) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1866) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1687) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.Choreographer.doFrame(Choreographer.java:525) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.os.Handler.handleCallback(Handler.java:615) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.os.Looper.loop(Looper.java:137) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at android.app.ActivityThread.main(ActivityThread.java:4745) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at java.lang.reflect.Method.invokeNative(Native Method) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at java.lang.reflect.Method.invoke(Method.java:511) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
03-19 17:17:55.747: E/AndroidRuntime(21858): at dalvik.system.NativeStart.main(Native Method) 
+0

NullPointerException이 던져해야 그 라인에서 아무것도 ... – Sam

+0

은'com.lakesidebaptist.lakesidelife.ui.Content.SermonActivity.setViewValue (SermonActivity.java:92)에서'무엇은 없다 : 즉,이 같은 시도 92 번 라인? – Sam

+0

코드에 표시했지만 제대로 표시되지 않았습니다. 그 줄 TextView입니다 playAudio = (TextView) findViewById (R.id.sermon_audio); – wisner

답변

3

T 스피과 같이 뭔가를하는 방법에서 공급하고의 리뷰를 찾을 수있는 뷰를 사용하여 :

TextView playAudio = (TextView) view.findViewById(R.id.sermon_audio); 

편집 :

그런 다음 findViewById를에 사용, 먼저 부모를 찾을 필요가 있습니다

RelativeLayout parent = (RelativeLayout)view.getParent(); 
TextView playAudio = (TextView) parent.findViewById(R.id.sermon_audio); 
+1

같은 오류가 발생합니다 ... 내 게시물에 코드의 스택 추적을 게시 해 드리겠습니다. – wisner

+0

@wisner'view.findViewById (R.id.sermon_video)'도 업데이트 했습니까? – Sam

+0

예. 스택 추적은 위에 게시 한 것과 같습니다. – wisner

관련 문제