2012-10-20 5 views
0

그래서 나는 onPostExecute 메소드 중에 listActivity를 채우는 데 문제가 있습니다. SingleData의 결과 목록은 정확합니다. 그런 다음 사용자 정의 어댑터를 사용하여 android.R.id.list ...에 바인딩합니다.목록보기에서 안드로이드 asynctask

하지만 오류가 발생합니다 ... 그리고 나는 정말로 이해하지 못합니다.

private class RequestAdapter extends ArrayAdapter<SingleData> { 

    private int _resource; 
    private LayoutInflater _inflater; 
    private Context _context; 

    public RequestAdapter(Context context, int textViewResourceId, 
      List<SingleData> objects) { 
     super(context, textViewResourceId, objects); 
     _resource = textViewResourceId; 
     _context = context; 
     _inflater = LayoutInflater.from(_context); 
    } 

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

     convertView = (ListView)_inflater.inflate(_resource,null); 
     SingleData sdd = getItem(position); 

     ImageView iv = (ImageView)convertView.findViewById(R.id.imagePlaceHolder_IV); 
     iv.setImageBitmap(sdd.thumbIMG); 

     TextView tv = (TextView)convertView.findViewById(R.id.createdAt_TV); 
     tv.setText(sdd.timeStamp); 

     // TODO Auto-generated method stub 
     return convertView;   
    } 

} 

을 여기에 onPostExecute입니다 : 왜 ... 그래서 여기에 ... 어댑터의 코드입니다

private class DownloadTheImages extends AsyncTask<Void, Void, List<SingleData>> { 

    private Context _ctx; 

    public DownloadTheImages(Context ctx) { 
     _ctx = ctx; 
    } 

    protected void onPostExecute(List<SingleData> result) {    

     ListView mainLV = (ListView)findViewById(android.R.id.list); 
     mainLV.setAdapter(new RequestAdapter(_ctx, R.layout.single_row, result)); 

    } 

    protected List<SingleData> doInBackground(Void... params) { 
       ..... 
      .... 
       } 
     } 

과 로그 캣 :

,147,179 ?

단서 ... 감사합니다 ..

이러한 새로운 에러 있습니다

10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.widget.AbsListView.obtainView(AbsListView.java:1430) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.widget.ListView.makeAndAddView(ListView.java:1745) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.widget.ListView.fillDown(ListView.java:670) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.widget.ListView.fillFromTop(ListView.java:727) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.widget.ListView.layoutChildren(ListView.java:1598) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.widget.AbsListView.onLayout(AbsListView.java:1260) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.view.View.layout(View.java:7175) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.view.View.layout(View.java:7175) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1047) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.view.View.layout(View.java:7175) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.view.View.layout(View.java:7175) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1140) 
10-20 16:32:56.615: E/AndroidRuntime(1487):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 

답변

0

이 라인은이 문제를 일으키는 원인이된다.

 RequestAdapter adapter; // This will be member variable 
    ListView mainLV = (ListView)findViewById(android.R.id.list); 
    mainLV.setAdapter(new RequestAdapter(_ctx, R.layout.single_row, result)); 

이동에서 onCreate에있는이 선() 단순히 ArrayList의 '결과'에 값을 추가하고() adapter.notifyDatasetChanged를 호출 onPostExecute에서 다음 어댑터를 인스턴스화하기 전에 결과를 초기화합니다. onPostExecute() 또는 onProgressUpdate()에서 뷰를 찾지 마십시오.

+0

나는 immeadetly 것을 시도 할 것이다 ... –

+0

지금은 처음에는, setAdapter 방법에 나에게 오류를 제공합니다 ... 나는 어떤 검사가 없다가 TEH 어댑터의 getView에서 becaseu 추측 경우 obecjt하는시 getItem을 수행하는 것은 null이거나 비어 있습니다 ... 어떤 조언을 어떻게 확인합니까? –

+0

어댑터를 설정하기 전에 결과를 초기화해야합니다. ArrayList입니까? –

0

내가 작동하는 onPostExecute를 이해하는 방법은 doInBackground()에서 전달 된 결과 개체를 필요로한다는 것입니다. 따라서 doinbackground에 결과를 반환하지 않는 한 RequestAdapter에 전달하면 NullPointer를 얻을 수 있습니다. 결과 멤버를 어디에서 초기화합니까? OnCreate에서?

protected List<SingleData> doInBackground(Void... reuslt) { 
      ..... 
     .... 
     ///Do some stuff 

      return result; 
      } 
    } 


private class DownloadTheImages extends AsyncTask<Void, Void, List<SingleData>> { 

private Context _ctx; 

public DownloadTheImages(Context ctx) { 
    _ctx = ctx; 
} 
+0

나는 반환 목록을 끝에 전달합니다. DoinBackground. 디버그 섹션에서 breakpoint는 onPostExecute 내에서 어댑터를 호출하기 전에 올바른 objct를 제공하므로 List 이 onPostExecute에 올바르게 전달됩니다 ... –

+0

return list .. 이것은 doInBackground의 끝 부분에있는 whta입니다. –

+0

오, 당신의 doInbackground에 대한 코드를 보지 못했기 때문에 조금 혼란 스러웠습니다. 아래 사람은 내가 listview를 부 풀리지 만, onPostExec가 아니라 onCreate에서 어댑터를 인스턴스화하고 설정한다고 말합니다. 왜 그런 식으로하고있는 지 이유는 무엇입니까? –

관련 문제