0

我有一个片段FragmentTab1并且我想替换由一个列表视图和两个按钮组成的AllContactsFragment片段。替换执行良好,但数据未显示在ListView中。数据也显示在 log cat 中。

FragmentTab1 内部的替换代码为:

AllContactsFragment allContactsFragment = new AllContactsFragment();
FragmentTransaction transaction = getFragmentManager()
                .beginTransaction();
transaction.addToBackStack(null);
transaction.add(R.id.fragmentTabLayout1, allContactsFragment);
transaction.commit();

我在 AllContactsFragment 内的列表视图中填写数据,例如:

    public class AllContactsFragment extends SherlockFragment implements
        OnClickListener {

    ListView listViewAllContact;
    Button btnAdd, btnCacel;
    List<BlockNumber> contactNumberlist;
    View rootView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_all_contacts, container,
                false);
        // data are comes well & checked in Log cat
        contactNumberlist = PhoneUtils.getAllContacts(getActivity());
        listViewAllContact = (ListView) rootView
                .findViewById(R.id.listViewAllContact);

        ContactListAdapter adapter = new ContactListAdapter(getActivity(),
                contactNumberlist, m_onSelectedEventCalender);

        listViewAllContact.setAdapter(adapter);

        if (container == null) {
            return null;
        }
        return rootView;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

    }
    @Override
    public void onClick(View v) {

    } 
}

我还分享了我的 ContactListAdapter 适配器

   public class ContactListAdapter extends BaseAdapter {

    private List<BlockNumber> allContactsNumbers = null;
    public Context context;
    public LayoutInflater inflater;
    private ViewHolder holder;

    private onSelectedEventCalender m_onSelectedEventCalender;

    public ContactListAdapter(Context context, List<BlockNumber> allNumberList,
            onSelectedEventCalender m_onSelectedEventCalender) {

        super();
        this.context = context;
        this.allContactsNumbers = allNumberList;
        this.inflater = (LayoutInflater) this.context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        this.m_onSelectedEventCalender = m_onSelectedEventCalender;
    }

    @Override
    public int getCount() {

        return allContactsNumbers.size();
    }

    @Override
    public Object getItem(int position) {

        return position;
    }

    @Override
    public long getItemId(int position) {

        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        try {

            if (convertView == null) {
                holder = new ViewHolder();

                convertView = inflater.inflate(R.layout.list_row, null);
                convertView.setMinimumHeight(50);

                holder.textViewContactName = (TextView) convertView
                        .findViewById(R.id.textview_contact_name);

                holder.textView_Contact_Number = (TextView) convertView
                        .findViewById(R.id.textview_number);

                convertView.setTag(holder);

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

                holder.textViewContactName.setText(allContactsNumbers.get(
                        position).getName());

                holder.textView_Contact_Number.setText(allContactsNumbers.get(
                        position).getNumber());

                holder.textViewContactName.setTag(allContactsNumbers
                        .get(position));

                return convertView;
            }

        } catch (Exception ex) {
            Log.w("Exception", ex.getMessage());
        }

        return null;

    }

    public static class ViewHolder {

        TextView textViewContactName;
        TextView textView_Contact_Number;
        // TextView textViewEventEndDate;
    }

    public interface onSelectedEventCalender {
        void onSelectedEventCalender(BlockNumber aBlockNumber, int type);

    }
}

AllContactsFragment 的对应 XML 是 fragment_all_contacts.xml :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_new" >

<!-- android:background="#80000000" -->

<RelativeLayout
    android:id="@+id/relativeLayoutFragmentMain"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ListView
        android:id="@+id/listViewAllContact"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/imageViewLine1" >
    </ListView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dip"
        android:layout_alignParentBottom="true"
        android:background="@drawable/action_bar"
        android:gravity="center_vertical"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/btnAdd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dip"
            android:layout_weight="1"
            android:text="Add" />

        <Button
            android:id="@+id/btnCanel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="8dip"
            android:layout_weight="1"
            android:text="Home" />
    </LinearLayout>
</RelativeLayout>
</RelativeLayout>

可能是我错过了什么?

编辑:使上面的代码正确。

从 ListView 定义 XML 中删除 android:layout_below="@+id/imageViewLine1" ,从适配器中的 getView() 中删除 return null 并检查设置为 listview 的数据是否可用。

4

2 回答 2

0

我会尝试

1)在 xml 中将您的列表视图设置为“高于”您的线性布局按钮栏

2) 创建 ContactListAdapter 适配器后调用 adapter.notifyDataSetChanged()

3) 在适配器中的第一个 if - 之后 convertView.setTag(holder); 设置返回转换视图;

4)在onViewCreated()方法中创建和设置适配器

或者

用 imageview 替换你的 listview 一次,看看你是否会看到图像,而不是你确定 listview 是失败的(不要忘记设置背景!)

于 2013-10-19T10:26:30.803 回答
0

哇!我是个多么愚蠢的人?我的contactNumberlist是空的,因为我没有在列表中添加对象。我的原木猫误导了我。感谢@Ragunandan 和@tom nobleman,感谢他们发现错误的能力。

我的 ContactListAdapter getView() 看起来像:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {
        holder = new ViewHolder();

        convertView = inflater.inflate(R.layout.list_row, null);
        convertView.setMinimumHeight(50);

        holder.textViewContactName = (TextView) convertView
                .findViewById(R.id.textview_contact_name);
        holder.textView_Contact_Number = (TextView) convertView
                .findViewById(R.id.textview_number);
        holder.imgViewContactImage = (ImageView) convertView
                .findViewById(R.id.imgViewContactImage);

        convertView.setTag(holder);

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

    if (allContactsNumbers.size() <= 0) {
        holder.textViewContactName.setText("No Data");

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

        String name = allContactsNumbers.get(position).getName();
        holder.textViewContactName.setText(name);

        String number = allContactsNumbers.get(position).getNumber();
        holder.textView_Contact_Number.setText(number);

        Uri Uri = allContactsNumbers.get(position).getImage_Uri();
        if (Uri != null) {
            holder.imgViewContactImage.setImageURI(Uri);
        } else {
            holder.imgViewContactImage.setImageResource(R.drawable.ic_no_image);
        }

        Log.d("Contacts in Adapter", "" + name + "" + number);

    }
    return convertView;
}
于 2013-10-19T18:19:11.583 回答