ImageView的setVisibility(0)和空指针异常 [英] ImageView setVisibility(0) and null pointer exception

查看:2013
本文介绍了ImageView的setVisibility(0)和空指针异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有2 XML 文件,主文件,其中我有一个的ListView 和其他的地方我提出一些的定制我的的ListView
第二个 XML 是在我的自定义使用 ArrayAdapter

在第二个 XML 我有一个的ImageView ,我想在某一时刻设置为可见的,但我我得到的空指针异常,因为我从来没有与 setCurrentView 设置第二 XML 文件,其中是我的的ImageView

我试图做到这一点:

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

你能告诉我怎么解决?

感谢您。

编辑:

下面是更多code:

main.xml中

 <?XML版本=1.0编码=UTF-8&GT?;
  < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
   机器人:方向=垂直
   机器人:layout_width =FILL_PARENT
   机器人:layout_height =FILL_PARENT>  < ListView控件
   机器人:ID =@ + ID / ListView01
   机器人:layout_height =WRAP_CONTENT
   机器人:layout_width =FILL_PARENT/>
< / LinearLayout中>

第二个XML:

 <?XML版本=1.0编码=UTF-8&GT?;
< LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
 机器人:方向=垂直
 机器人:layout_width =FILL_PARENT
 机器人:layout_height =FILL_PARENT>< ImageView的
    机器人:ID =@ + ID / statusOkImage
    机器人:layout_width =WRAP_CONTENT
    机器人:layout_height =WRAP_CONTENT
    机器人:SRC =@绘制/ STATUS_OK
    机器人:知名度=隐形/>  < TextView的机器人:ID =@ + ID /名称
  机器人:TEXTSIZE =14sp
  机器人:文字样式=大胆
  机器人:文字颜色=#FFFF00
  机器人:layout_width =WRAP_CONTENT
  机器人:layout_height =WRAP_CONTENT/>
 < TextView的机器人:ID =@ + ID / cityState
  机器人:layout_width =WRAP_CONTENT
  机器人:layout_height =WRAP_CONTENT/>
 < TextView的机器人:ID =@ + ID /手机
  机器人:layout_width =WRAP_CONTENT
  机器人:layout_height =WRAP_CONTENT/>
< / LinearLayout中>

MainActivity:

 公共类TestListActivity延伸活动{
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.main);
    ArrayList的<&SearchResult所GT;的SearchResult = GetSearchResults();
    最终的ListView LV1 =(ListView控件)findViewById(R.id.ListView01);
    lv1.setAdapter(新MyCustomBaseAdapter(这一点,SearchResult所));
}私人的ArrayList<&SearchResult所GT; GetSearchResults(){
 ArrayList的<&SearchResult所GT;结果=新的ArrayList<&SearchResult所GT;(); SearchResult所SR1 =新的SearchResult();
 SR1 =新的SearchResult();
 sr1.setName(弗雷德 - 琼斯);
 sr1.setCityState(拉斯维加斯);
 sr1.setPhone(612-555-8214);
 results.add(SR1);
 返回结果;
}
}

自定义适配器:

 公共类MyCustomBaseAdapter延伸BaseAdapter {
 私有静态的ArrayList<&SearchResult所GT; sea​​rchArrayList; 私人LayoutInflater mInflater; 公共MyCustomBaseAdapter(上下文的背景下,ArrayList的<&SearchResult所GT;业绩){
  sea​​rchArrayList =结果;
  mInflater = LayoutInflater.from(上下文);
 } 公众诠释的getCount(){
  返回searchArrayList.size();
 } 公共对象的getItem(INT位置){
  返回searchArrayList.get(位置);
 } 众长getItemId(INT位置){
  返回的位置;
 } 公共查看getView(INT位置,查看convertView,父母的ViewGroup){
  ViewHolder持有人;
  如果(convertView == NULL){
   convertView = mInflater.inflate(R.layout.custom_row_view,NULL);
   持有人=新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(保持器);
  }其他{
   支架=(ViewHolder)convertView.getTag();
  }  mInflater =(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);     查看查看= 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(位置).getName());
  holder.txtCityState.setText(searchArrayList.get(位置).getCityState());
  holder.txtPhone.setText(searchArrayList.get(位置).getPhone());  返回convertView;
 } 静态类ViewHolder {
  TextView的txtName的;
  TextView的txtCityState;
  TextView的txtPhone;
 }
}

和finnaly资源类为ListView

 公共类的SearchResult {
 私人字符串名称=;
 私人字符串cityState =;
 私人字符串电话=; 公共无效setname可以(字符串名称){
  this.name =名称;
 } 公共字符串的getName(){
  返回名称;
 } 公共无效setCityState(字符串cityState){
  this.cityState = cityState;
 } 公共字符串getCityState(){
  返回cityState;
 } 公共无效setPhone(字符串电话){
  this.phone =电话;
 } 公共字符串getPhone(){
  回电话;
 }
}


解决方案

要设置定义在XML中的知名度来看,则需要抬高的的活动,看来,的setContentView自动去做,因为你是不是在第二个XML调用的setContentView,然后用:

  LayoutInflater吹气=(LayoutInflater)getSystemService(Layout_INFLATER_SERVICE);
查看查看= inflater.inflate(R.layout.secondxml,NULL);

,然后找到该视图您的视图:

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

但只会工作的视图对象,它不会影响原来的XML。

I have 2 xml files, a main file where I have a listView and the other where I am making some customisations to my listView. The second xml is used on my Custom ArrayAdapter.

In the second xml i have a ImageView which I would like to set to visible at one moment but I am getting the null pointer exception because i am never setting with setCurrentView the second xml file where is my ImageView.

I am trying to do this:

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

Could you please tell me how to resolve that?

Thank you.

Edit:

Here is more code:

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>

Second 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>

MainActivity:

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;
}
}

custom Adapter:

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;
 }
}

And finnaly the resource class for the 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;
 }
}

解决方案

To set visibility view defined in xml, you need to inflate that view in activity, setContentView do it automatically, and as you are not invoking setContentView on second xml, then use:

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

and then find your view from that view:

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

but it will work only for view object, it does not affect original xml.

这篇关于ImageView的setVisibility(0)和空指针异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆