2017-10-06 73 views
1

我對android不是很有經驗,我在MainActivity的佈局中創建了一個listView,並在列表中爲每一行創建了一個包含兩個文本視圖和一個ImageView的佈局(layout = view_of_list),我創建了MyContact類,它包含三個成員:String name,String phone,int Id。 我也創建了CustomAdapter類。最後我將我的CostumAdapter設置爲我的listView。當我運行代碼時它崩潰了; Android的監視器說,在CustomAdapter.java在行:列表視圖不顯示在我的活動

rowView = inflater.inflate(R.layout.view_of_list, parent, false); 

得到這個錯誤:

試圖調用虛擬方法android.view.View android.view.LayoutInflater.inflate(INT,android.view .ViewGroup,boolean)'在空對象引用

我的錯誤在哪裏?

activity_main.xml中

<android.widget.RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.list.steve.list.MainActivity"> 

<ListView 
    android:layout_width="368dp" 
    android:layout_height="495dp" 
    tools:layout_editor_absoluteY="8dp" 
    tools:layout_editor_absoluteX="8dp" 
    android:id="@+id/list_view"/> 
</android.widget.RelativeLayout> 

view_of_list.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:id="@+id/relative_layout"> 

<ImageView 
    android:id="@+id/img_profile" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:srcCompat="@mipmap/ic_launcher" 
    android:layout_marginTop="8dp" 
    android:layout_marginLeft="8dp" /> 
<TextView 
    android:id="@+id/tv_phone" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" 
    android:layout_alignTop="@id/img_profile" 
    android:layout_toRightOf="@id/img_profile" 
    android:layout_marginLeft="8dp"/> 

<TextView 
    android:id="@+id/tv_name" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" 
    android:layout_below="@id/tv_phone" 
    android:layout_toRightOf="@id/img_profile" 
    android:layout_marginTop="8dp" 
    android:layout_marginLeft="8dp"/> 
</RelativeLayout> 

MyContact.java

public class Mycontact { 
    private String name; 
    private String phone; 
    private int id; 
    public Mycontact(String name, String phone, int id){ 
     this.name = name; 
     this.phone = phone; 
     this.id = id; 
    } 
    public void setName(String name){ 
     this.name = name; 
    } 
    public void setPhone(String phone){ 
     this.phone = phone; 
    } 
    public void setId(int id){ 
     this.id = id; 
    } 
    public String getName(){ 
     return name; 
    } 
    public String getPhone(){ 
     return phone; 
    } 
    public int getId(){ 
     return id; 
    } 

CustomAdapter.java

public class CustomAdapter extends ArrayAdapter { 
private ArrayList mycontacts; 
private Mycontact contact; 
private LayoutInflater inflater; 
private ViewHolder holder; 
public CustomAdapter(Context context, ArrayList contact) { 
    super(context, R.layout.view_of_list, contact); 
    this.mycontacts = contact; 
} 

@NonNull 
@Override 
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
    View rowView = convertView; 
    if(convertView == null) { 
     rowView = inflater.inflate(R.layout.view_of_list, parent, false); 
     holder.tv_name = (TextView) rowView.findViewById(R.id.tv_name); 
     holder.tv_phone = (TextView) rowView.findViewById(R.id.tv_phone); 
     holder.img_profile = (ImageView) rowView.findViewById(R.id.img_profile) 
     rowView.setTag(holder); 
    }else{ 
     holder = (ViewHolder) rowView.getTag(); 
    } 
    contact = (Mycontact)mycontacts.get(position); 
    holder.tv_name.setText(contact.getName()); 
    holder.tv_phone.setText(contact.getPhone()); 
    holder.img_profile.setImageResource(contact.getId()); 
    return rowView; 
} 

public class ViewHolder{ 
    TextView tv_name; 
    TextView tv_phone; 
    ImageView img_profile; 

} 

}

MainActivity.java

public class MainActivity extends AppCompatActivity { 
Mycontact contact; 
ArrayList<Mycontact> mycontacts; 
ListView listView; 
CustomAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mycontacts = new ArrayList<Mycontact>(); 
    adapter = new CustomAdapter(this,mycontacts); 
    listView = (ListView) findViewById(R.id.list_view); 
    listView.setAdapter(adapter); 

} 
public void AddContact(){ 
    mycontacts.add(new Mycontact("steve","09",R.drawable.one)); 
    mycontacts.add(new Mycontact("hasan","091112345678",R.drawable.two)); 
    mycontacts.add(new Mycontact("hosein", "09151338089",R.drawable.three)); 
} 

}

回答

0

您應在清單上設置適配器之前調用的addContact()方法。和初始化您的吹氣在構造這樣

public CustomAdapter(Context context, ArrayList contact) { 
    super(context, R.layout.view_of_list, contact); 
    this.mycontacts = contact; 
    this.inflater = LayoutInflater.from(context); 

} 

也應該構建getView viewHolder類()方法,這樣

@NonNull 
@Override 
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
    View rowView = convertView; 
    holder = new ViewHolder(); 
    if(convertView == null) { 
     rowView = inflater.inflate(R.layout.view_of_list, parent, false); 
     holder.tv_name = (TextView) rowView.findViewById(R.id.tv_name); 
     holder.tv_phone = (TextView) rowView.findViewById(R.id.tv_phone); 
     holder.img_profile = (ImageView) rowView.findViewById(R.id.img_profile) 
     rowView.setTag(holder); 
    }else{ 
     holder = (ViewHolder) rowView.getTag(); 
    } 
    contact = (Mycontact)mycontacts.get(position); 
    holder.tv_name.setText(contact.getName()); 
    holder.tv_phone.setText(contact.getPhone()); 
    holder.img_profile.setImageResource(contact.getId()); 
    return rowView; 
} 
+0

我稱呼它,現在它的崩潰。在行中的CustopAdapter.java rowView = inflater.inflate(R.layput.view_of_list,parent,false);我得到了這個錯誤:嘗試調用虛擬方法'android.view.View android.view.LayoutInflater.inflate(int,android.view.ViewGroup,boolean)'null對象引用 – AmirHosein

+0

因爲你的inflater爲null,你應該初始化它在你的構造函數中像這樣public public CustomAdapter(Context context,ArrayList contact){super(context,R.layout.view_of_list,contact); this.mycontacts = contact; this.inflater = LayoutInflater.from(context); } – M2016

+0

當我從ViewHolder得到新的錯誤,因爲前面的原因,我調用View持有者的構造函數,然後應用程序正常運行。 tnx – AmirHosein