2013-08-18 25 views
2

這是我的代碼,用於爲ListView創建自定義視圖。它使用一個名爲SquareProgressBar自定義視圖:實例化convertView時的NPE

package com.example.simpledownloader.adapter; 

import net.yscs.android.square_progressbar.SquareProgressBar; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

import com.example.simpledownloader.R; 
import com.example.simpledownloader.sharable.Sharable; 

public class TaskAdapter extends BaseAdapter { 
    Context ctx = null; 


    public TaskAdapter(Context ctx){ 
     this.ctx = ctx; 
    } 
//-------------------------------------------------------------------------------- 
    @Override 
    public int getCount() { 
     return Sharable.downloads.size(); 
    } 
//-------------------------------------------------------------------------------- 
    @Override 
    public Object getItem(int index) { 
     return Sharable.downloads.get(index); 
    } 
//-------------------------------------------------------------------------------- 
    @Override 
    public long getItemId(int id) { 
     return id; 
    } 
//-------------------------------------------------------------------------------- 
    @Override 
    public View getView(int index, View convertView, ViewGroup parent) { 
     if(convertView == null){ 
      LayoutInflater inflater = LayoutInflater.from(ctx); 
      convertView = inflater.inflate(R.layout.task, parent, false); 
     } 
     SquareProgressBar taskProgressBar = (SquareProgressBar) convertView.findViewById(R.id.taskProgressBar); 
     TextView statusMsg = (TextView) convertView.findViewById(R.id.statusMsg); 
     TextView name = (TextView) convertView.findViewById(R.id.taskName); 

     taskProgressBar.setProgress((int)Sharable.downloads.get(index).getProgress()); 
     taskProgressBar.setImage(R.drawable.task_image); 
     taskProgressBar.setColor("#C9C9C9"); 
     taskProgressBar.setWidth(8); 
     name.setText(Sharable.downloads.get(index).toString()); 
     statusMsg.setText(Sharable.downloads.get(index).getStatus()); 

     return convertView; 
    } 
//-------------------------------------------------------------------------------- 
} 

不過,我得到一個NPE:

08-18 15:10:56.184: E/AndroidRuntime(5639): FATAL EXCEPTION: main 
08-18 15:10:56.184: E/AndroidRuntime(5639): java.lang.NullPointerException 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at net.yscs.android.square_progressbar.SquareProgressBar.setOpacity(SquareProgressBar.java:184) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at net.yscs.android.square_progressbar.SquareProgressBar.setProgress(SquareProgressBar.java:105) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at com.example.simpledownloader.adapter.TaskAdapter.getView(TaskAdapter.java:47) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.widget.AbsListView.obtainView(AbsListView.java:2159) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1246) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.widget.ListView.onMeasure(ListView.java:1158) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.View.measure(View.java:15518) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.View.measure(View.java:15518) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.View.measure(View.java:15518) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:847) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.View.measure(View.java:15518) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.View.measure(View.java:15518) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.Choreographer.doFrame(Choreographer.java:532) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.os.Handler.handleCallback(Handler.java:725) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.os.Looper.loop(Looper.java:137) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
08-18 15:10:56.184: E/AndroidRuntime(5639):  at dalvik.system.NativeStart.main(Native Method) 

這是爲什麼?
我想這是沒有找到方形進度條。
CTX是傳遞這一類
可共享應用程序上下文是包含了爲活動

回答

2

而不是共享的所有單一對象的自定義類:

taskProgressBar.setProgress((int)Sharable.downloads.get(index).getProgress()); 
taskProgressBar.setImage(R.drawable.task_image); 

使用:

taskProgressBar.setImage(R.drawable.task_image); 
taskProgressBar.setProgress((int)Sharable.downloads.get(index).getProgress()); 
+0

哦,所以裏面的圖像是空的..該死! :D –

+0

@LittleChild你沒有看過庫的源代碼:) – Luksprog

+1

即使沒有看看源代碼,似乎很邏輯,不是嗎? – Snicolas

1

@Littl eChild請嘗試以下代碼來解決您的問題。設置進度和所有內容後,將不透明度設置爲false。

taskProgressBar.setOpacity(false); 

否則,請與您的代碼在這裏創建一個新的問題(https://github.com/mrwonderman/android-square-progressbar/issues),這樣我就可以儘快解決這個問題。

更新:我現在試過了,不透明度是問題。我現在在1.3.0分支中解決了這個問題,這個分支很快就會推出。

+0

我有另一個問題,即使在setOpacity(false)'之後,進度條也不會更新。我顯示了多少文件已經下載到我的自定義適配器的'getView()'中,但是'SquareProgressBar'甚至在'notifyDataSetChanged()'到適配器之後不會更新。儘管在普通的'ProgressBar'中運行良好。請參閱:http://imgur.com/q0KzPPv –

+0

logcat顯示已下載文件的字節數。 :) –