2011-11-01 4 views
0

초보자 수준입니다. 안드로이드 앱에서 다른 원격 이미지와 텍스트로 listview를 채우고 있습니다. 어댑터를 사용하여 listview 및 AsynTask를 채워 이미지를로드합니다. 그러나 나는 두 가지 문제에 직면 해 있으며 며칠 이래 가장 많이 시도했지만 불행히도 성공할 수는 없습니다. 첫 번째 문제는 첫 번째 이미지와 텍스트가 listview의 첫 번째 행에 나타나고 두 번째 행에 두 번째 이미지와 텍스트가 채워지는 것보다 사라지고 사라지는 것과 마찬가지로 각 행에 이미지와 텍스트가 표시되고 사라지는 것입니다.FATAL listview에 이미지를 표시하는 동안 주 예외가 발생했습니다.

11-01 20:03:56.449: ERROR/AndroidRuntime(29665): FATAL EXCEPTION: main 
11-01 20:03:56.449: ERROR/AndroidRuntime(29665): java.lang.NullPointerException 

이 내 메인 클래스입니다 : 내가 startParsing 메소드를 호출하고 기본 클래스에서

public class ParseImagesActivity extends ListActivity { 
String myURL; 
String xml; 
Document doc; 
NodeList nodes; 
//int i=5; 
int j=0; 
int equal; 
int h; 
String[] length = {"1","2","3","4","5","6","7","8","9",null}; 

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

     xml = XmlParser.getXML("http://url.com"); 
     doc = XmlParser.XMLfromString(xml); 
     nodes = doc.getElementsByTagName("item"); 
     Element g = (Element)nodes.item(j); 
     startParsing(XmlParser.getValue(g,"thumb")); 

    } 

가 그것에게 URL을 전달하는 두 번째 문제는 마지막 행이 응용 프로그램의 충돌보다 나타나고 예외 아래에주는 실행 중지했을 때이다 ..1 XmlParser 클래스에서 URL을 반환하는 함수 XmlParser.getValue (g, "thumb")에 의해 첫 번째 이미지에 액세스합니다. 방법을 startParsing 것은 : 다른 이미지에 액세스하려면 ... 등을 여기에

private void startParsing(String url) { 

    new backgroundLoadListView().execute(url); 

} 

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

    @Override 
protected void onPostExecute(String unused) { 
     // TODO Auto-generated method stub 

    if(j<nodes.getLength()){ 
    setListAdapter(new MyCustomAdapter(ParseImagesActivity.this, R.layout.row, length)); 
      Log.e("post Execute","post execute="+j); 

     equal=j; 
     j++; 
     Element h = (Element)nodes.item(j); 
     startParsing(XmlParser.getValue(h,"thumb")); 
     } 


    } 

    @Override 
    protected void onPreExecute() { 

     } 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     //Log.e("do in back","do in back="+j); 
     String url = params[0]; 
     preLoadSrcBitmap(url); 
     return null; 
    } 

} 

은 내가 MyCustomerAdapter 생성자를 호출하고 있고 postExecute 방법에 내가 url2,3,4을 통과 startParsing 메소드를 호출하고 있습니다. MyCustomAdapter 클래스와 preloadSrcBitmap 방법은 다음과 같습니다 문제점 나를 돕는 사람들에

public class MyCustomAdapter extends ArrayAdapter<String> { 
    Bitmap bm; 


    public MyCustomAdapter(Context context, int textViewResourceId, 
      String[] objects) { 
     // 
     super(context, textViewResourceId, objects); 

     // TODO Auto-generated constructor stub 

     bm = srcBitmap; 
     Log.e("my customer adapter","my adapter"+j); 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     //return super.getView(position, convertView, parent); 

     View row = convertView; 

     if(row==null){ 
      LayoutInflater inflater=getLayoutInflater(); 
      row=inflater.inflate(R.layout.row, parent, false); 
            } 

     Log.e("getview",j+"calls"); 
     TextView label=(TextView)row.findViewById(R.id.weekofday); 
     ImageView icon=(ImageView)row.findViewById(R.id.icon); 
     if(j<nodes.getLength()) 
     { 
      if(equal==position) 
      { 
       Log.e("text view calls",""+equal); 
      Element f = (Element)nodes.item(equal); 

     label.setText(XmlParser.getValue(f, "title")); 
     icon.setImageBitmap(bm); 
     } 

     } 
     return row; 
     } 

} 

Bitmap srcBitmap; 
private void preLoadSrcBitmap(String url){ 
    //Log.e("preloadsrcbitmap","preloadsrcbitmap="+j); 
    BitmapFactory.Options bmOptions; 
    bmOptions = new BitmapFactory.Options(); 
    bmOptions.inSampleSize = 1; 

    srcBitmap = LoadImage(url, bmOptions); 

} 



/** Called when the activity is first created. */ 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 

    String selection = l.getItemAtPosition(position).toString(); 
    Toast.makeText(this, selection, Toast.LENGTH_LONG).show(); 
} 

private Bitmap LoadImage(String URL, BitmapFactory.Options options) 
{  
    Bitmap bitmap = null; 
    InputStream in = null;  
    try { 
     in = OpenHttpConnection(URL); 
     bitmap = BitmapFactory.decodeStream(in, null, options); 
     in.close(); 
    } catch (IOException e1) { 
    } 

    return bitmap;     
} 

private InputStream OpenHttpConnection(String strURL) throws IOException{ 
    InputStream inputStream = null; 
    URL url = new URL(strURL); 
    URLConnection conn = url.openConnection(); 

    try{ 
     HttpURLConnection httpConn = (HttpURLConnection)conn; 
     httpConn.setRequestMethod("GET"); 
     httpConn.connect(); 

     if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) { 
      inputStream = httpConn.getInputStream();  

     } 
    } 
    catch (Exception ex){ 
    } 

    return inputStream; 
} 

그리고 정말 고마워. 나는 그들을 알아낼 수 없다. (나는 한동안 이런 짓을하지 않았기 때문에 개요 : P) : AsyncTask를 사용하여 UI를 (활동과 상호 작용)를 업데이트

+0

이 스택 트레이스의 더 제공

감사합니다 - NPE가 일어난 경우 다음 줄이 당신을 말할 것이다는 –

답변

0

아무거나는 다음과 같은 구조를 가질 필요가

//AsyncTask starts here 
//code that doesn't run on the UI thread 
myASyncTask.runOnUiThread(new Runnable() { 
    //update your UI stuff here 
    }; 
//do more non-UI stuff here 

그것은 당신처럼 보인다 AsyncTask 메서드 내에서 ImageViews 및 TextViews를 동 기적으로 업데이트하려고합니다. 이로 인해 치명적인 오류가 발생합니다. 위의 코드를 사용해보십시오.

희망이 있습니다. 더 많은 설명이 필요하면 알려주세요.

+0

감사 Pheonixblade (다음 queston은 대부분 자동으로 대답한다). 설명하신 코드를 구현할 수있는 지침을 제발 제공해 주시겠습니까? – Larik

+0

내 코드를 업데이트 해 주실 수 있습니까? 감사합니다 – Larik

+0

나는 내 코드에서 몇 가지 변경 사항을 만들었지 만 치명적인 오류는 발생하지 않지만 listview 행의 이미지와 텍스트는 사라집니다. – Larik

관련 문제