2013-08-18 4 views
2

Вот мой код для создания настраиваемого представления для ListView. Он использует пользовательское представление с именем SquareProgressBar:NPE при создании экземпляра convertView

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 является контекст приложения, который передается этому классу
Sharable является пользовательский класс, который содержит все одноэлементные объекты, которые являются общими для всех видов деятельности

ответ

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

Oh so изображение внутри был null .. damn !! : D –

+0

@LittleChild Вы не смотрели исходный код библиотеки :) – Luksprog

+1

Кажется вполне логичным, даже не глядя на исходный код, нет? – Snicolas

1

@Littl eChild Пожалуйста, попробуйте следующий код, чтобы решить вашу проблему. После того, как вы установите прогресс и все, установите opacity в 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

Лог-код показывает, сколько байтов файла было загружено. :) –