问题
After googling alot i never found any helpful answer, so i'm posting my issue here. My problem is as follows :
I've a nested fragment (MainActivity calls SettingsFragment and that fragment calls another fragment named as ContactFragment) that uses a listview in it. I'm setting data in adapter but and call adapter.notifyDataSetChanged(); it adds an item with in ListView but show only images not TextViews. I debugged my code line by line each variable has its values but list items are not displaying it. Below is my Code.
ContactsFragment extends Fragment {
public static List<ContactItem> contactList;
private ContactsItemAdapter adapter;
private ListView lvContacts;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_contacts, container, false);
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
lvContacts = (ListView) getView().findViewById(R.id.lvContacts);
contactList = new ArrayList<ContactItem>();
contactList.add(new ContactItem(R.drawable.ic_action_overflow, "OverFlow", "Testing", SOS.CONTACT_TYPE_SMS));
adapter = new ContactsItemAdapter(getActivity(), R.layout.contact_item, contactList);
lvContacts.setAdapter(adapter);
}
Following is a Click Event for adding an item to the list
private void btnAddOnClick(int type){
contactList.add(new ContactItem(R.drawable.ic_action_call, "ABC", "123", "SMS"));
adapter.notifyDataSetChanged();
}
}
Following is fragment_contacts.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:gravity="center_horizontal"
android:orientation="vertical" >
<ListView
android:id="@+id/lvContacts"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp" >
</ListView>
</LinearLayout>
By Calling btnAddOnClick adds item in listview but empty like this
here you can see it shows call icon but not showing text views values. Please tell me what i'm doing wrong.
Here is adapter
public class ContactsItemAdapter extends ArrayAdapter<ContactItem> {
private LayoutInflater mInflater;
public ContactsItemAdapter(Context context, int resource,
List<ContactItem> contactList) {
super(context, resource, contactList);
mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
TextView tvName;
TextView tvValue;
ImageView ivIcon;
ContactItem rowData = ContactsFragment.contactList.get(position);
if (null == convertView) {
convertView = mInflater.inflate(R.layout.contact_item, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}
holder = (ViewHolder) convertView.getTag();
tvName = holder.getName();
tvName.setText(rowData.getName());
tvValue = holder.getValue();
tvValue.setText(rowData.getValue());
ivIcon = holder.getIcon();
ivIcon.setImageResource(rowData.getIcon());
return convertView;
}
public class ViewHolder {
private View mRow;
private TextView tvName = null;
private TextView tvValue = null;
private ImageView ivIcon = null;
public ViewHolder(View row) {
mRow = row;
}
public TextView getName() {
if (null == tvName) {
tvName = (TextView) mRow.findViewById(R.id.tvName);
}
return tvName;
}
public TextView getValue() {
if (null == tvValue) {
tvValue = (TextView) mRow.findViewById(R.id.tvValue);
}
return tvValue;
}
public ImageView getIcon() {
if (null == ivIcon) {
ivIcon = (ImageView) mRow.findViewById(R.id.icon);
}
return ivIcon;
}
}
}
ContactItem Class
public class ContactItem {
private int icon;
private String name;
private String value;
private String contactType;
public ContactItem() {
icon = R.drawable.ic_action_call;
name = "";
value = "";
contactType = "";
}
public ContactItem(int icon, String nameString, String valueString,
String type) {
this.icon = icon;
this.name = nameString;
this.value = valueString;
this.contactType = type;
}
public int getIcon() {
return icon;
}
public void setIcon(int icon) {
this.icon = icon;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getContactType() {
return contactType;
}
public void setContactType(String contactType) {
this.contactType = contactType;
}
}
contact_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="@color/holo_gray_light"
android:gravity="center_vertical" >
<ImageView
android:id="@+id/icon"
android:layout_width="25dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:contentDescription="@string/desc_list_item_icon"
/>
<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_alignParentBottom="true"
android:background="@android:color/darker_gray" />
<ImageView
android:id="@+id/ivCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"
android:src="@drawable/ic_action_cancel" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/divider"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/ivCancel"
android:layout_toRightOf="@+id/icon"
android:orientation="vertical"
android:weightSum="1">
<TextView
android:id="@+id/tvName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.49"
android:gravity="center_vertical"
android:paddingRight="40dp"
android:ellipsize="end"
android:text="Nauman Zubair"/>
<TextView
android:id="@+id/tvValue"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.49"
android:paddingRight="40dp"
android:ellipsize="end"
android:gravity="center_vertical"
android:text="+92 123 1234567"/>
</LinearLayout>
</RelativeLayout>
回答1:
Your code should work, I think the problem is your contact_item.xml layout. Somehow your design is hiding the text. Use a simpler layout design to see if it shows the text, try getting rid of the LinearLayout:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="55dp"
android:background="@color/holo_gray_light"
android:gravity="center_vertical" >
<ImageView
android:id="@+id/icon"
android:layout_width="25dp"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:contentDescription="@string/desc_list_item_icon" />
<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_alignParentBottom="true"
android:background="@android:color/darker_gray" />
<ImageView
android:id="@+id/ivCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"
android:src="@drawable/ic_action_cancel" />
<TextView
android:id="@+id/tvName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toLeftOf="@+id/ivCancel"
android:layout_toRightOf="@+id/icon"
android:gravity="center_vertical"
android:paddingRight="40dp"
android:ellipsize="end"
android:text="Nauman Zubair"/>
<TextView
android:id="@+id/tvValue"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_toLeftOf="@+id/ivCancel"
android:layout_toRightOf="@+id/icon"
android:paddingRight="40dp"
android:ellipsize="end"
android:gravity="center_vertical"
android:text="+92 123 1234567"/>
</RelativeLayout>
来源:https://stackoverflow.com/questions/24119696/listview-in-nested-fragment-showing-empty-list-item-only-textviews-not-images