#android #imageview
#Android #просмотр изображения
Вопрос:
Я получаю исключение нулевого указателя для ImageView imag = (ImageView) findViewById (R.id.image). У меня есть пользовательский макет, объявленный в R.layout.screen3, а список пользовательских файлов объявлен в R.layout.custom_row_screen3. В каждой строке есть несколько задач, и в зависимости от их статуса изображение отображается справа от каждой строки.
Пожалуйста, помогите мне решить эту проблему, поскольку я новичок в Android.
вот мой код ниже :::
public class screen3 extends ListActivity{
final ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
...
...
...
TextView tv;
ImageView imag;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.screen3);
System.out.println("Screen3");
...
...
...
SimpleAdapter adapter = new SimpleAdapter(this, list,
R.layout.custom_row_screen3,
new String[] { "tname","schedule", "note", "time"}, new int[] { R.id.text1Screen3task,
R.id.text2Screen3task, R.id.text3Screen3task, R.id.text4Screen3task});
populateList();
setListAdapter(adapter);
}
public void populateList() {
for(int i = 0; i <numberOfTasks; i )
{
HashMap<String, String> h = new HashMap<String, String>();
HashMap<String, String> hm = new HashMap<String, String>();
h = tasks.get(i);
...
...
hm.put("tname", h.get("taskName"));
hm.put("schedule", h.get("STime") " - " h.get("ETime"));
if(h.get("taskStatus").trim().equals("1")){
imag = (ImageView) findViewById(R.id.image);// <<---- NULL RETURNED
imag.setImageResource(R.drawable.done);
...
...
}
else{
imag = (ImageView) findViewById(R.id.image);// <<---- NULL RETURNED
imag.setImageResource(R.drawable.not);
...
...
}
list.add(hm);
}
...
...
}
screen3 xml
<ListView android:id="@id/android:list" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:background="#000000"
android:drawSelectorOnTop="false">
</ListView>
custom_row_screen3 xml
<LinearLayout android:orientation="vertical"
android:layout_width="0dip" android:layout_weight="1"
android:layout_height="wrap_content">
<TextView android:id="@ id/text1Screen3task"
android:layout_width="wrap_content" android:layout_height="0dip"
android:layout_weight="1" android:textSize="21sp" android:textStyle="bold"
android:gravity="clip_horizontal" />
<TextView android:id="@ id/text2Screen3task"
android:layout_width="wrap_content" android:layout_height="0dip"
android:layout_weight="1" android:textSize="16sp" android:gravity="clip_horizontal" />
<TextView android:id="@ id/text3Screen3task"
android:layout_width="wrap_content" android:layout_height="0dip"
android:layout_weight="1" android:textSize="16sp" android:gravity="clip_horizontal" />
<TextView android:id="@ id/text4Screen3task"
android:layout_width="wrap_content" android:layout_height="0dip"
android:layout_weight="1" android:textSize="16sp" android:gravity="clip_horizontal" />
</LinearLayout>
<ImageView android:id="@ id/image" android:layout_width="wrap_content" android:paddingBottom="51dip"
android:layout_height="wrap_content" android:layout_marginRight="16dip"
/>
Спасибо
Абинав Тяги
Комментарии:
1. Вы уверены, что в вашем макете screen3 имя ImageView указано как image? Если да, можете ли вы опубликовать свой screen3.xml коды?
2. 05-02 15:45:18.006: ОШИБКА / AndroidRuntime(488): java.lang.RuntimeException: Не удается запустить activity ComponentInfo{com.scandihealth/com.scandihealth.screen3}: java.lang. Исключение NullPointerException 05-02 15:45:18.006: ОШИБКА / AndroidRuntime (488): в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 05-02 15:45:18.006: ОШИБКА / AndroidRuntime (488): в android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 05-02 15:45:18.006: ОШИБКА / AndroidRuntime(488): при android.app.ActivityThread.access $ 2300 (ActivityThread.java: 125)
3. 05-02 15:45:18.006: ОШИБКА / AndroidRuntime (488): в android.app.ActivityThread$ H.Обработка сообщения (ActivityThread.java:2033) 05-02 15:45:18.006: ОШИБКА / AndroidRuntime(488): в android.os.Handler.DispatchMessage (обработчик.java:99) 05-02 15:45:18.006: ОШИБКА / AndroidRuntime (488): в android.os.Looper.loop (Looper.java:123) 05-02 15:45:18.006: ОШИБКА / AndroidRuntime (488): в android.app.ActivityThread.main (ActivityThread.java:4627) 05-02 15:45:18.006: ОШИБКА / AndroidRuntime(488): в java.lang.reflect. Метод.вызывающий (собственный метод)
4. 05-02 15:45:18.006: ОШИБКА / AndroidRuntime(488): в java.lang.reflect. Метод.invoke(метод.java:521) 05-02 15:45:18.006: ОШИБКА / AndroidRuntime(488): в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 05-02 15:45:18.006: ОШИБКА / AndroidRuntime(488): в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:626) 05-02 15:45:18.006: ОШИБКА / AndroidRuntime(488): в dalvik.system.NativeStart.main (собственный метод)
5. 05-02 15:45:18.006: ОШИБКА / AndroidRuntime (488): вызвана: java.lang. Исключение NullPointerException 05-02 15:45:18.006: ОШИБКА / AndroidRuntime (488): в com.scandihealth.screen3.populate(screen3.java:141) 05-02 15:45:18.006: ОШИБКА / AndroidRuntime (488): в com.scandihealth.screen3.onCreate(screen3.java:49) 05-02 15:45:18.006: ОШИБКА / AndroidRuntime(488): в android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 05-02 15:45:18.006: ОШИБКА / AndroidRuntime (488): в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
Ответ №1:
Короче говоря: вы должны написать ListAdapter, который отображает представления в списке. Кажется, вы используете findViewById()
неправильный вид / контекст (на макете screen3 xml). Пример, содержащий ListAdapter, доступен на сайте разработчика Android.
getView()
Метод должен в основном выглядеть примерно так:
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (convertView == null) {
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, null);
}
h = tasks.get(i);
if(h.get("taskStatus").trim().equals("1")){
imag = (ImageView) v.findViewById(R.id.image);
imag.setImageResource(R.drawable.done);
} else {
// ...
}
return v;
}
Комментарии:
1. Не могли бы вы объяснить подробнее. Я новичок в Android 🙂
Ответ №2:
проверьте, доступен ли ресурс, который вы используете, в вашей папке res или нет.
Ответ №3:
Похоже, вы не указали android: id =»@ id / image» в imageview внутри вашего макета
Редактировать: Я думаю, проблема в том, что вы используете findViewById до того, как ListView в вашем ListActivity будет содержать ваш custom_row, у которого есть ImageView.
Попробуйте выполнить setListAdapter перед populateList()
Комментарии:
1. оно есть в R.layout.custom_row_screen3 как <ImageView android: id=»@ id /image» android:layout_width=»wrap_content» android: paddingBottom=»51dip» android: layout_height=»wrap_content» android:layout_marginRight=»16dip» />
2. Опубликуйте код макета screen3, если можете. Возможно, вы используете метод findViewById неправильного представления, и внутри него нет изображения.
3. Я не могу опубликовать это прямо сейчас … только что присоединился к этому форуму, поэтому существует ограничение в 8 часов… попытаюсь опубликовать по частям
Ответ №4:
populateList() запускается до того, как ListView отображается на экране, поэтому custom_row_screen3 не существует в Activity.
Вы могли бы создать подкласс SimpleAdapter и переопределить getView() или setViewImage(), но я часто нахожу, что проще анонимно реализовать SimpleAdapter.ViewBinder и назначить его с помощью SimpleAdapter#setViewBinder().
В ViewBinder верните false, если переданный вид не является ImageView. Если это так, вы можете использовать карту данных (переданную как объект), чтобы проверить значение ключа «TaskStatus».
Обязательно сделайте это перед вызовом setListAdapter().
adapter.setViewBinder(new SimpleAdapter.ViewBinder () {
@Override
boolean setViewValue(View view, Object data, String textRepresentation) {
if (!(view instanceof ImageView)) return false;
String taskStatus = ((Map<String, String>) data).get("taskStatus").trim();
((ImageView) view).setImageResource(taskStatus.equals("1") ? R.drawable.done :
R.drawable.not);
}
});
Комментарии:
1. Спасибо, что помогли мне, но это полная путаница для меня прямо сейчас!!! Я новичок в Android и не пользовался связующими устройствами и всем прочим.
2. не работает адаптер SimpleAdapter = новый SimpleAdapter(…..); adapter.setViewBinder(новый SimpleAdapter.ViewBinder () { @SuppressWarnings(«непроверенный») @Переопределить общедоступное логическое значение setViewValue(просмотр вида, данных объекта, текстового представления строки) { if (!(просмотр экземпляра ImageView)) возвращает false; Строка ts = ((HashMap<Строка, String>) data).get(«TaskStatus»).trim(); ((ImageView) view).setImageResource(ts.равно(«1») ? R.выводимый . выполнено:R.drawable.not); возвращает true; } }); populateList(); setListAdapter(адаптер);
3. @Abhinav: под «не работает» вы имеете в виду, что ничего не отображается, что генерируется исключение или что оно не компилируется? Кроме того, попробуйте вызвать populateList() перед созданием SimpleAdapter
Ответ №5:
Спасибо всем вам, вы все указали мне правильное направление, что мой imageview не указывает на мой адаптер, я выполнил шаги, указанные вhttp://devblogs.net/2011/01/04/custom-listview-with-image-using-simpleadapter / и это сработало!!! просто нужно было поместить мое изображение в hashmap… Я бился головой о стену!!!