ImageView setVisibility (0) и исключение нулевого указателя

У меня есть 2 файла xml, в основном файле есть файл listView, а в другом я делаю некоторые настройки для своего файла listView. Второй xml используется на моем Custom ArrayAdapter.

Во втором xml у меня есть ImageView, который я хотел бы сделать видимым в какой-то момент, но я получаю null pointer exception, потому что я никогда не устанавливаю с помощью setCurrentView второй файл xml, где находится мой ImageView.

Я пытаюсь сделать это:

ImageView statusOk=(ImageView)findViewById(R.id.statusOkImage);
statusOk.setVisibility(0);

Не могли бы вы рассказать мне, как это решить?

Спасибо.

Редактировать:

Вот еще код:

main.xml

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

  <ListView
   android:id="@+id/ListView01"
   android:layout_height="wrap_content"
   android:layout_width="fill_parent"/>
</LinearLayout>

Второй xml:

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

<ImageView
    android:id="@+id/statusOkImage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/status_ok" 
    android:visibility="invisible"/>

  <TextView android:id="@+id/name"
  android:textSize="14sp"
  android:textStyle="bold"
  android:textColor="#FFFF00"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"/>
 <TextView android:id="@+id/cityState"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"/>
 <TextView android:id="@+id/phone"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"/>
</LinearLayout>

Основная деятельность:

public class TestListActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ArrayList<SearchResults> searchResults = GetSearchResults();
    final ListView lv1 = (ListView) findViewById(R.id.ListView01);
    lv1.setAdapter(new MyCustomBaseAdapter(this, searchResults));
}

private ArrayList<SearchResults> GetSearchResults(){
 ArrayList<SearchResults> results = new ArrayList<SearchResults>();

 SearchResults sr1 = new SearchResults();
 sr1 = new SearchResults();
 sr1.setName("Fred Jones");
 sr1.setCityState("Las Vegas, NV");
 sr1.setPhone("612-555-8214");
 results.add(sr1);
 return results;
}
}

пользовательский адаптер:

public class MyCustomBaseAdapter extends BaseAdapter {
 private static ArrayList<SearchResults> searchArrayList;

 private LayoutInflater mInflater;

 public MyCustomBaseAdapter(Context context, ArrayList<SearchResults> results) {
  searchArrayList = results;
  mInflater = LayoutInflater.from(context);
 }

 public int getCount() {
  return searchArrayList.size();
 }

 public Object getItem(int position) {
  return searchArrayList.get(position);
 }

 public long getItemId(int position) {
  return position;
 }

 public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder holder;
  if (convertView == null) {
   convertView = mInflater.inflate(R.layout.custom_row_view, null);
   holder = new ViewHolder();
   holder.txtName = (TextView) convertView.findViewById(R.id.name);
   holder.txtCityState = (TextView) convertView.findViewById(R.id.cityState);
   holder.txtPhone = (TextView) convertView.findViewById(R.id.phone);


   convertView.setTag(holder);
  } else {
   holder = (ViewHolder) convertView.getTag();
  }

  mInflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);

     View view=mInflater.inflate(R.layout.custom_row_view, null);

     ImageView statusOk=(ImageView)view.findViewById(R.id.imageView1);
        statusOk.setVisibility(View.VISIBLE);
  holder.txtName.setText(searchArrayList.get(position).getName());
  holder.txtCityState.setText(searchArrayList.get(position).getCityState());
  holder.txtPhone.setText(searchArrayList.get(position).getPhone());

  return convertView;
 }

 static class ViewHolder {
  TextView txtName;
  TextView txtCityState;
  TextView txtPhone;
 }
}

И, наконец, класс ресурсов для listView

public class SearchResults {
 private String name = "";
 private String cityState = "";
 private String phone = "";

 public void setName(String name) {
  this.name = name;
 }

 public String getName() {
  return name;
 }

 public void setCityState(String cityState) {
  this.cityState = cityState;
 }

 public String getCityState() {
  return cityState;
 }

 public void setPhone(String phone) {
  this.phone = phone;
 }

 public String getPhone() {
  return phone;
 }
}

person Milos Cuculovic    schedule 16.02.2012    source источник
comment
Как вы раздуваете второе представление, которое содержит statusOk ImageView?   -  person Macarse    schedule 16.02.2012
comment
Спасибо, Макарс, я его не надуваю, как это сделать?   -  person Miloš    schedule 16.02.2012
comment
Проверьте этот вопрос: stackoverflow.com/q/3477422/119895   -  person Macarse    schedule 16.02.2012
comment
@ Ана, можешь ли ты вставить свой код xml и java для того же?   -  person MKJParekh    schedule 16.02.2012
comment
Добавил все что использую Сони, спасибо.   -  person Miloš    schedule 16.02.2012


Ответы (4)


Чтобы установить представление видимости, определенное в xml, вам нужно раздуть это представление в действии, setContentView сделать это автоматически, и, поскольку вы не вызываете setContentView во втором xml, затем используйте:

LayoutInflater inflater=(LayoutInflater)getSystemService(Layout_INFLATER_SERVICE);
View view=inflater.inflate(R.layout.secondxml, null);

а затем найдите свое представление из этого представления:

ImageView statusOk=(ImageView)view.findViewById(R.id.statusOkImage);
statusOk.setVisibility(0);

но это будет работать только для объекта просмотра, это не влияет на исходный xml.

person jeet    schedule 16.02.2012
comment
Спасибо за ответ, но inflate(R.layout.secondxml); запрашивает у меня еще один аргумент int. - person Miloš; 16.02.2012
comment
вместо secondxml напишите свое второе имя xml. - person jeet; 16.02.2012
comment
Да, но методу inflate нужен еще один аргумент View view=inflater.inflate(R.layout.user_submissions_customisation, ViewGroup); - person Miloš; 16.02.2012
comment
Теперь все в порядке, проблема в том, что я пытаюсь вызвать эту функцию в классе, который расширяет BaseAdapter и не выполняет никаких действий, и у меня есть ошибка в LAYOUT_INFLATER_SERVICE. - person Miloš; 16.02.2012
comment
@ Ана: если ответ является решением вашей проблемы, вы должны принять его, чтобы другие могли получить от него информацию;) - person Houcine; 20.02.2012

Изменить на:

statusOk.setVisibility(View.INVISIBLE);

и проверьте, готово ли изображение использовать findViewById, например, вы вызываете метод, а затем выполняете setContentView или если это действительно ImageView и т. д.

person goodm    schedule 16.02.2012
comment
Спасибо, но все та же проблема: я думаю, это проблема просмотра. - person Miloš; 16.02.2012

Вот решение для доступа к представлению из другого класса. Примечание: currentActivity — это контекст корневого класса.

LayoutInflater inflater = (LayoutInflater)currentActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view=inflater.inflate(R.layout.secondxml, null);
person SCube Pakistan    schedule 22.05.2013
comment
Мне нужен был код (Context.LAYOUT_INFLATER_SERVICE), спасибо! - person user3079872; 11.01.2016

Используйте LayoutInflater.getLayoutInflater() для создания XML-файла макета в соответствующем представлении. объекты.

person kv-prajapati    schedule 16.02.2012
comment
Спасибо, проблема в том, что я не в классе, который расширяет активность - person Miloš; 16.02.2012