ListView in nested fragment showing empty list item, (only textviews not images)

六月ゝ 毕业季﹏ 提交于 2019-12-11 19:35:15

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!