2015-01-21 5 views
-1

성공적으로 로그인 한 후 사용자에게 전송 된 요청의 목록보기가있는 앱을 생성해야합니다. 내 로그인 잘 작동합니다. 그러나 목록보기를 만들 때 문제가 발생했습니다.이러한 오류는 앱에 목록보기를 추가했을 때 나타납니다.

나는 listview 튜토리얼을 따르고 있으며, 테스트를 마쳤다. 그래서 잘 작동 했으므로 코드에 통합했다. 내가 할 때, 내 응용 프로그램이리스트 뷰를 가지고 활동에 대한 내 코드입니다

errors in my logcat enter image description here

충돌하기 시작합니다.

import java.io.BufferedReader; 
    import java.io.InputStreamReader; 
    import java.io.OutputStreamWriter; 
    import java.net.URL; 
    import java.net.URLConnection; 
    import java.net.URLEncoder; 
    import java.util.ArrayList; 

    import org.json.JSONArray; 
    import org.json.JSONObject; 

    import android.app.Activity; 
    import android.content.Context; 
    import android.content.SharedPreferences; 
    import android.content.SharedPreferences.Editor; 
    import android.os.AsyncTask; 
    import android.os.Bundle; 
    import android.util.Log; 
    import android.view.Menu; 
    import android.view.View; 
    import android.widget.AdapterView; 
    import android.widget.AdapterView.OnItemClickListener; 
    import android.widget.ListView; 
    import android.widget.Toast; 

    public class AdminActivity extends Activity { 

     ArrayList<Actors> actorsList; 

     ActorAdapter adapter; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_admin); 
      Bundle extras = getIntent().getExtras(); 
      String usertype = extras.getString("UserType"); 
      String userid = extras.getString("User_ID"); 
      actorsList = new ArrayList<Actors>(); // EDITED I FORGOT THIS 
      //PART, IT FIXED THE LOG IN ISSUE BUT STILL THE LIST VIEW DOESNT 
      //DISPLAY AND AFTER DIRECTING ME TO THE NEXT PAGE, IT CRASHES AFTER AWHILE 
      new GetRequests(this).execute(userid,usertype); 
      ListView listview = (ListView)findViewById(R.id.list); 
      adapter = new ActorAdapter(getApplicationContext(), R.layout.row, actorsList); 

      listview.setAdapter(adapter); 
      Log.i("lv", "does it go here"); 
      listview.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> arg0, View arg1, int position, 
         long id) { 
        Log.i("lvclick", "does it go here"); 
        // TODO Auto-generated method stub 
        Toast.makeText(getApplicationContext(), actorsList.get(position).getName(), Toast.LENGTH_LONG).show();    
       } 
      }); 
      Toast.makeText(this.getBaseContext(), userid + usertype, Toast.LENGTH_LONG).show(); 



     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      getMenuInflater().inflate(R.menu.admin, menu); 
      return true; 
     } 

     public class GetRequests extends AsyncTask<String,Void,String>{ 

      private Context context; 
      public GetRequests(Context context) { 
       this.context = context; 
      } 

      protected void onPreExecute(){ 

      } 

       @Override 
       protected String doInBackground(String... arg0) { 
       try { 
       Log.i("fetch", "does it go here"); 
         String userid = (String)arg0[0]; 

         String usertype = (String)arg0[1]; 

         String link="http://192.168.1.37/mobile/get-requests.php"; 

         String data = URLEncoder.encode("userid", "UTF-8") + "=" + URLEncoder.encode(userid, "UTF-8"); 

         data += "&" + URLEncoder.encode("usertype", "UTF-8") + "=" + URLEncoder.encode(usertype, "UTF-8"); 

         URL url = new URL(link); 

         URLConnection conn = url.openConnection(); 

         conn.setDoOutput(true); 

         OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 

         wr.write(data); 

         wr.flush(); 

         BufferedReader reader = new BufferedReader (new InputStreamReader(conn.getInputStream())); 

         StringBuilder sb = new StringBuilder(); 

         String line = null; 

         // Read Server Response 

         while((line = reader.readLine()) != null) 
         { 
          sb.append(line); 
          break; 
         } 
         return sb.toString(); 
       } 

       catch(Exception e){ 

        return new String("Exception: " + e.getMessage()); 

       } 

       } 

      @Override 
       protected void onPostExecute(String result){ 

       if(result.length() == 0){ 
        Toast.makeText(this.context, "Invalid User Id or Password", Toast.LENGTH_LONG).show(); 
       } 
       else{ 

        try { 
         Log.i("got", "does it go here"); 
          JSONArray jArr = new JSONArray(result); 
          for(int i = 0; i < jArr.length(); i++){ 
           JSONObject jobj = jArr.getJSONObject(i); 
           Actors actor = new Actors(); 

           actor.setName(jobj.getString("Request_ID")); 
           actor.setDescription(jobj.getString("User_ID")); 
           actor.setDob(jobj.getString("Date_Needed")); 
           actor.setCountry(jobj.getString("fromTime_Needed")); 
           actor.setHeight(jobj.getString("fromTime_Needed")); 
           actor.setSpouse(jobj.getString("Subject")); 
           actor.setChildren(jobj.getString("Group")); 
           actor.setImage(jobj.getString("Prof_ID")); 

           actorsList.add(actor); 

          } 
          Toast.makeText(this.context, result, Toast.LENGTH_LONG).show(); 


         } 
        catch(Exception e) { 
          e.printStackTrace(); 
        } 


       } 
       } 
      } 

     public void logout(View view){ 
       SharedPreferences sharedpreferences = getSharedPreferences 
       (MainActivity.MyPREFERENCES, Context.MODE_PRIVATE); 
       Editor editor = sharedpreferences.edit(); 
       editor.clear(); 
       editor.commit(); 
       Log.i("logout", "does it go here?"); 
       moveTaskToBack(true); 
       AdminActivity.this.finish(); 
      } 
     public void exit(View view){ 
      moveTaskToBack(true); 
      AdminActivity.this.finish(); 
     } 
    } 

이 블록이 없으면 내 로그인을 먼저 표시 한 다음 원하는대로 설정합니다.

listview.setAdapter(adapter); 
      Log.i("lv", "does it go here"); 
      listview.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> arg0, View arg1, int position, 
         long id) { 
        Log.i("lvclick", "does it go here"); 
        // TODO Auto-generated method stub 
        Toast.makeText(getApplicationContext(), actorsList.get(position).getName(), Toast.LENGTH_LONG).show();    
       } 
      }); 

위 코드 블록을 사용하면 앱을 연 직후 앱이 중단됩니다.

* EDITED : 로그인 문제가 해결되었지만 잠시 후 충돌이 발생합니다. 무슨 문제가있는 것 같습니까?

답변

0

actorsList 변수가 초기화되지 않습니다.

변경 : ArrayList<Actors> actorsList; 에 : 당신은 당신이 데이터의 변화가 있음을 통지해야 actorsList.add(actor); 전화 ArrayList<Actors> actorsList = new ArrayList();

그리고 기억.

새 값을 추가하는 편리한 방법이 있으므로 ArrayAdapter을 사용하는 것이 좋습니다. 로컬로 초기화하고 getView 메서드를 재정의하거나 ActorAdapter를이 유형으로 확장 할 수 있습니다.

2

actorsList;이 초기화되지 않았으므로 NPE이 표시됩니다. 그래서

ArrayList<Actors> actorsList = new ArrayList<Actors>(); 

에 선언을 변경하고 다른 문제는 당신이 직접 AsyncTask를 실행 한 후 당신이 그것을 할 때문에 빈 목록으로 Adapter을 설정하려고하는 것입니다. 이 "비동기"실행하기 때문에, 당신은 작업이 완료되면 그래서이 Adapter을로드 할 수 있습니다 onPostExecute()이 코드를

ListView listview = (ListView)findViewById(R.id.list); 
adapter = new ActorAdapter(getApplicationContext(), R.layout.row, actorsList); 

listview.setAdapter(adapter); 

를 이동해야 setAdaoter()

에 호출하기 전에 완료되지 않습니다.

또한 stacktrace의 스크린 샷을 붙여 넣지 마십시오. 읽기가 어렵습니다. 저장 버튼을 클릭하여 코드와 마찬가지로 코드 블록에 게시물에 붙여 넣을 수 있습니다.

+0

나는 이것을 시도했지만 도움이되었지만 여전히 listview를 표시하지는 않는다. – ladyisfirst

+0

여전히 충돌이 발생하거나 목록보기가 표시되지 않습니까? –