2014-12-07 3 views
0

Я создал Listfragment, который отображает список видов. Здесь ListFragment:Исключение Nullpointer при попытке доступа к дочерним элементам ListView

public class AroundYou extends ListFragment { 
private int[] images = new int[] { 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin, 
     R.drawable.pinguin 
}; 

private String[] names = new String[] { 
     "Pingu", 
     "Pingu", 
     "Pingu", 
     "Pingu", 
     "Pingu", 
     "Pingu", 
     "Pingu", 
     "Pingu", 
     "Pingu", 
     "Pingu"   
}; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 

    // Each row in the list stores country name, currency and flag 
    List<HashMap<String,String>> aList = new ArrayList<HashMap<String,String>>(); 

    for(int i=0;i<10;i++){ 
     HashMap<String, String> hm = new HashMap<String,String>(); 
     hm.put("name", names[i]); 
     hm.put("image",Integer.toString(images[i])); 
     aList.add(hm); 
    } 

    // Keys used in Hashmap 
    String[] from = { "name","image"}; 

    // Ids of views in listview_layout 
    int[] to = { R.id.name,R.id.image}; 

    // Instantiating an adapter to store each items 
    // R.layout.listview_layout defines the layout of each item 
    SimpleAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), aList, R.layout.around_you_line_of_list, from, to); 

    setListAdapter(adapter); 

    return super.onCreateView(inflater, container, savedInstanceState); 
} 
} 

Каждая строка ListView отображает изображение и текст. Это одно и то же изображение/текст на данный момент, но позже я поместил разные изображения/текст. XML-файл в строке around_you_line_of_list.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 

<ImageView 
    android:id="@+id/image" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="2" 
    android:contentDescription="@string/hello_world" 
    android:paddingBottom="10dp" 
    android:paddingRight="10dp" 
    android:paddingTop="10dp" /> 

<TextView 
    android:id="@+id/name" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" /> 

</LinearLayout> 

Это прекрасно работает. Но я захотел в ListFragment изменить изображения каждой строки ListView. Поэтому я сделал это в функции onActivityCreated. И я получил исключение NullPointerException, когда я вызываю getChildAt (int). Зачем ? Я имею в виду, я вызываю ListView AFTER onCreateView, а затем просто хочу: взять дочерний вид этого ListView, взяв образное изображение этого ребенка, модифицируя изображение.

Как я могу получить доступ к взглядам ребенка? ...

 public void onActivityCreated(Bundle savedInstanceState) 
    { 
     super.onActivityCreated(savedInstanceState); 
     ListView listView = getListView(); 
     for(int i = 0;i < 10;i++){ 
//I'm getting a null pointer exception at this line . 
      View view = listView.getChildAt(i); 
      ImageView imageview = (ImageView) view.findViewById(R.id.image); 

      BitmapDrawable drawable = (BitmapDrawable)imageview.getDrawable(); 

//here I 'm getting a bitmap from the drawable, and then applying a function that modify 
//the bitmap . 
      Bitmap foreign_image = drawable.getBitmap(); 
      Canvas canvas = null; 
      Bitmap bitmap = setBitmapClippedCircle(foreign_image,200,200,canvas); 
//here I'm putting the result in the imageview . 
      imageview.setImageBitmap(bitmap); 

     } 

    } 

Если вам нужно больше кода (как Wich активности отображает фрагмент или другой материал), или информацию, скажем, его me :)

+0

Вы видели кого-то структуру кода? потому что из того, что я помню (может быть, неправильно), listview не поддерживает некоторые функции viewgroup..right? да, позвольте мне посмотреть – Elltz

+0

Я не совсем понимаю ваш комментарий. Фактически, я использовал этот учебник для этого: http: //wptrafficanalyzer.in/blog/android-listfragment-with-images-and-text-using-android-support-library/ Но факт в том, что я хочу изменить изображения после помещения их в список –

ответ

0

Если вы хотите изменить представленные данные, вы должны изменить данные, которые хранятся в списке, а не сам список.

Существует три компонента: ваши данные, ваш адаптер, который преобразует ваши данные в представления, которые могут отображаться в виде списка, и представление списка, которое запрашивает представления из адаптера на основе позиции списка.

Если вам нужно изменить представленное, измените данные. Обновите адаптер с новым, измененным, набором данных и вызовите adapter.notifyDatasetChanged(). Это приведет к тому, что ваш просмотр списка будет запрашивать данные от адаптера снова, поскольку он устарел.

Откуда вы сейчас находитесь в своем коде, вы можете сделать одну из двух вещей.

  • Вместо простого использования простого адаптера создайте класс, который расширяет BaseAdapter и использует его. Добавьте метод для изменения ваших данных (например, setImages(List images)), который также включает в себя супер-вызов notifyDatasetChanged() в качестве последнего утверждения.
  • создать новый экземпляр SimpleAdapter с новыми данными и setListAdapter() с новым экземпляром адаптера.

Первый предпочтительный, но tl: Dr; «не изменяйте ваши взгляды напрямую, это AdapterView, потому что он уже поддерживается источником данных».

+0

Спасибо. Я пытаюсь сделать первый. Но я борюсь с методом Посмотреть getView (int position, View convertView, родитель ViewGroup) Я не вижу, как его реализовать. –

+0

@PtitSualty Я написал [аналогичный ответ ранее] (http://stackoverflow.com/questions/25653905/adapter-update-not-visible-rows/25654089#25654089). Там я добавляю реализации stub для 'getView (int, View, ViewGroup)', который, я надеюсь, объяснит назначение каждого параметра (из имен вспомогательных методов, которые я добавил) – ataulm

0

Вы получаете NullPointerException, потому что не все ячейки видны, поэтому вы получите нулевой вид для них.

+0

Итак, как я могу их изменить, если у меня нет доступа к ним? Я полагаю, что я должен сделать их видимыми.Конкретно, как мне это сделать? 'Причина, когда я запускаю приложение WHITHOUT onActivityCreated, я могу видеть строки списка (но изображения еще не изменены). Поэтому я предположил, что они были видны. –

+0

Извините, я не видел строку, где вы получили NPE, больше похоже на то, что ваш ListView равен нулю – TheRedFox

+0

Но как это может быть null, если я могу видеть все строки (и их элементы), когда я не использую onActivityCreated? Я запутался сейчас:/ –

Смежные вопросы