2013-08-31 3 views
0

강제 종료를 유지하는 사용자 지정 목록보기를 만들었으며 그 이유를 알아 내는데 어려움이 있습니다. 이 뷰를 다른 뷰에서 모델링 할 때부터 뷰의 이름을 올바르게 지정하지 않았을 수도 있습니다. 그러나 나는 아직 나의 실수를 발견하지 못한다. 사용자 지정 목록보기 강제 종료

08-30 22:04:44.073 4011-4011/com.beerportfolio.beerportfoliopro E/AndroidRuntime: FATAL EXCEPTION: main 
     java.lang.NullPointerException 
     at com.example.beerportfoliopro.BreweryLocationInfoAdapter.getView(BreweryLocationInfoAdapter.java:50) 
     at android.widget.AbsListView.obtainView(AbsListView.java:2410) 
     at android.widget.ListView.makeAndAddView(ListView.java:1963) 
     at android.widget.ListView.fillDown(ListView.java:815) 
     at android.widget.ListView.fillFromTop(ListView.java:876) 
     at android.widget.ListView.layoutChildren(ListView.java:1813) 
     at android.widget.AbsListView.onLayout(AbsListView.java:2238) 
     at android.view.View.layout(View.java:13900) 
     at android.view.ViewGroup.layout(ViewGroup.java:4391) 
     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649) 
     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507) 
     at android.widget.LinearLayout.onLayout(LinearLayout.java:1420) 
     at android.view.View.layout(View.java:13900) 
     at android.view.ViewGroup.layout(ViewGroup.java:4391) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
     at android.view.View.layout(View.java:13900) 
     at android.view.ViewGroup.layout(ViewGroup.java:4391) 
     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649) 
     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507) 
     at android.widget.LinearLayout.onLayout(LinearLayout.java:1420) 
     at android.view.View.layout(View.java:13900) 
     at android.view.ViewGroup.layout(ViewGroup.java:4391) 
     at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
     at android.view.View.layout(View.java:13900) 
     at android.view.ViewGroup.layout(ViewGroup.java:4391) 
     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2183) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1984) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1221) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4710) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:746) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:572) 
     at android.view.Choreographer.doFrame(Choreographer.java:538) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:731) 
     at android.os.Handler.handleCallback(Handler.java:615) 
     at android.os.Handler.dispatchMessage(Handler.java:92) 
     at android.os.Looper.loop(Looper.java:155) 
     at android.app.ActivityThread.main(ActivityThread.java:5536) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1074) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:841) 
     at dalvik.system.NativeStart.main(Native Method) 

가 내 BreweryLocationInfoAdapter 코드

를 :

import java.util.List; 

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.RatingBar; 
import android.widget.TextView; 
import com.beerportfolio.beerportfoliopro.R; 

public class BreweryLocationInfoAdapter extends ArrayAdapter<BreweryLocationData>{ 

    Context context; 
    int layoutResourceId; 
    List<BreweryLocationData> data = null; 

    public BreweryLocationInfoAdapter(Context context, int layoutResourceId, List<BreweryLocationData> data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     breweryHolder holder = null; 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new breweryHolder(); 
      holder.txtBrewery = (TextView)row.findViewById(R.id.beerNameList); 
      holder.txtDistance = (TextView)row.findViewById(R.id.beerBreweryNameList); 

      row.setTag(holder); 
     } 
     else 
     { 
      holder = (breweryHolder)row.getTag(); 
     } 

     BreweryLocationData beer = data.get(position); 
     holder.txtBrewery.setText(beer.brewery); 
     holder.txtBrewery.setText(beer.distance); 


     return row; 
    } 

    static class breweryHolder 
    { 
     TextView txtBrewery; 
     TextView txtDistance; 


    } 
} 

GetNearbyBreweries 코드 : 나는 어떤 이유로 행에 대해 생각

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.StatusLine; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.AsyncTask; 
import android.preference.PreferenceManager; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.Toast; 
import android.widget.AdapterView.OnItemClickListener; 

import com.beerportfolio.beerportfoliopro.R; 

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

    Context c; 
    private ProgressDialog Dialog; 

    public GetNearbyBreweries (Context context) 
    { 
     c = context; 
     Dialog = new ProgressDialog(c); 
    } 

    @Override 
    protected String doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 
     return readJSONFeed(arg0[0]); 
    } 

    protected void onPreExecute() { 
     Dialog.setMessage("Locating Breweries"); 

     Dialog.setTitle("Loading"); 
     Dialog.setCancelable(false); 
     Dialog.show(); 
    } 

    protected void onPostExecute(String result){ 
     //decode json here 
     try{ 
      JSONObject json = new JSONObject(result); 


      //acces listview 
      ListView lv = (ListView) ((Activity) c).findViewById(R.id.topTasteBeers); 

      //make array list for beer 
      final List<BreweryLocationData> tasteList = new ArrayList<BreweryLocationData>(); 



      for(int i = 0; i < json.getJSONArray("data").length(); i++) { 

       String brewery = json.getJSONArray("data").getJSONObject(i).getJSONObject("brewery").getString("name"); 
       String id = json.getJSONArray("data").getJSONObject(i).getJSONObject("brewery").getString("id"); 
       String latitude = json.getJSONArray("data").getJSONObject(i).getString("latitude"); 
       String longitude = json.getJSONArray("data").getJSONObject(i).getString("longitude"); 
       String distance = json.getJSONArray("data").getJSONObject(i).getString("distance"); 

       Toast.makeText(c, "Brewery: " + brewery, Toast.LENGTH_SHORT).show(); 


       int count = i + 1; 


       //create object 
       BreweryLocationData tempLocation = new BreweryLocationData(brewery, id, longitude , latitude,distance); 

       //add to arraylist 
       tasteList.add(tempLocation); 


       //add items to listview 
       BreweryLocationInfoAdapter adapter1 = new BreweryLocationInfoAdapter(c ,R.layout.toptaste_layout, tasteList); 
       lv.setAdapter(adapter1); 

       //set up clicks 
       lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
        @Override 
        public void onItemClick(AdapterView<?> arg0, View arg1, 
              int arg2, long arg3) { 
         ShortBeerInfo o=(ShortBeerInfo)arg0.getItemAtPosition(arg2); 

         String tempID = o.id; 
         String tempBrewID = o.brewery; 

         Toast toast = Toast.makeText(c, tempID, Toast.LENGTH_SHORT); 
         toast.show(); 

         //get beer details from id 

         Intent myIntent = new Intent(c, BeerPage2.class); 
         myIntent.putExtra("id", tempID); 
         myIntent.putExtra("breweryID", tempBrewID); 
         c.startActivity(myIntent); 


        } 
       }); 




      } 

     } 
     catch(Exception e){ 

     } 

     Dialog.dismiss(); 

    } 

    public String readJSONFeed(String URL) { 
     StringBuilder stringBuilder = new StringBuilder(); 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(URL); 
     try { 
      HttpResponse response = httpClient.execute(httpGet); 
      StatusLine statusLine = response.getStatusLine(); 
      int statusCode = statusLine.getStatusCode(); 
      if (statusCode == 200) { 
       HttpEntity entity = response.getEntity(); 
       InputStream inputStream = entity.getContent(); 
       BufferedReader reader = new BufferedReader(
         new InputStreamReader(inputStream)); 
       String line; 
       while ((line = reader.readLine()) != null) { 
        stringBuilder.append(line); 
       } 
       inputStream.close(); 
      } else { 
       Log.d("JSON", "Failed to download file"); 
      } 
     } catch (Exception e) { 
      Log.d("readJSONFeed", e.getLocalizedMessage()); 
     } 
     return stringBuilder.toString(); 
    } 

} 
+0

어떤 줄이 50 줄입니까? –

+1

@ 돼지 고기 hastebin을 사용하여 코드를 붙여 넣고 저장하고 라인 번호를보십시오. –

+0

hrmm, 공백 라인에 해당합니다. 팁을 주셔서 감사합니다. –

답변

1

이 만들어지고 있지 않습니다 여기

내 힘 가까이 오류입니다 .

row.setTag (holder)를 설정할 때까지 해당 행! = null을 디버깅하여 다시 확인할 수 있습니까?

난 단지 1. 어쩌면 당신은 당신의 인플레이터를 얻기 위해 사용하는 컨텍스트가 올바르지 않은 것을 추측 할 수는 어느 쪽이든 나는 당신의에서 resourceID를 잘 작성하지, 다음과 같은 방법

LayoutInflater.from(context).inflate(R.layout.cell, viewGroup, false); 

를 사용하는 것을 선호 또는. .

당신은 사용자 정의 어댑터 getCount 방법 작성하지 않은
1

:

public int getCount() { 

      return //Something here 
     } 
+0

이 작품을 했습니까? –

+0

get count 메소드가 무엇을 의미하는지 확실하지 않은 이유를 모르겠다. – Mike

+0

getCount()는 어댑터가 나타내는 데이터 세트에있는 항목 수를 나타냅니다. –

0

행 50 것 같다

holder.txtBrewery.setText(beer.brewery); 

따라서 ID가 R.id.beerNameList 인 TextView에 다른 ID가 있거나 beer.brewery이 null입니다.

디버거를 사용하면 이러한 유형의 문제를 신속하게 해결할 수 있습니다. 문제가되는 줄에 중단 점을 놓고 디버거를 실행하면 주어진 줄에서 일시 중지됩니다. 그런 다음 어떤 객체가 null인지 정확히 알 수 있으므로 문제를 즉시 해결할 수 있습니다.

0

사용자 지정 어댑터에 데이터를 보관하지 마십시오. 항상 사용

BreweryLocationData beer = getItem (position);

어댑터에서 표시해야하는 개체를 얻으려면 이렇게하면 어댑터 외부에서 수정되는 데이터 문제를 피할 수 있습니다.

관련 문제