ListFragment的自定义布局不起作用

时间:2014-05-18 13:11:58

标签: android android-layout android-fragments

我尝试使用带有自定义布局的ListFragment:简单的静态标题,在SimpleCursorAdapter给出的ListContent下面。列表本身也有自定义布局。 SimpleCursorAdapter工作(查询很好,列表工作的自定义布局)。只要我不为Fragment本身使用自定义布局,一切正常。 如果我添加片段的布局,只有标题(Textview)工作,列表保持为空。

列表的自定义布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<TextView
    android:id="@+id/label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="20sp" >
</TextView>

<TextView
    android:id="@+id/value"
    android:layout_width="50dp"
    android:layout_height="wrap_content"
    android:gravity="right"
    android:layout_gravity="right"
    android:textSize="20sp" >
</TextView>

片段的自定义布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/last_update"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</TextView>
<ListView
    android:id="@id/android:list"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</ListView>
<TextView android:id="@id/android:empty"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:background="#FF0000"
           android:text="No data">
</TextView>    

我评论了一些东西 - 值得一试,因为我读到它有帮助 - 对我来说它没有帮助。

最后一个机器人,至少是片段代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    return inflater.inflate(R.layout.viewfragment, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    TableDataGateway tableGate = new TableDataGateway(getActivity());
    tableGate.UpdateUIRecords();
    TextView tv = (TextView) getView().findViewById(R.id.last_update);
    tv.setText(tableGate.getLastUpdateDate());
    Cursor cursor = tableGate.selectUIRecords();

    dBadapter = new SimpleCursorAdapter(getActivity(), R.layout.viewlayout, cursor, new String[] { DB_COL_GUI_LABEL, DB_COL_LAST_KNOWN_VALUE }, new int[] { R.id.label, R.id.value }, 0);
    super.setListAdapter(dBadapter);

}

问题是:为什么ListAdapter没有与片段布局连接?

此致

Flizz

澄清问题 我有一个像Android + ListFragment with a custom view hierarchy这样的问题 但我没有将内容叠加在一起,我只看到屏幕右上角的TextView内容,下面列表应该只是一个白色背景。 我非常肯定已经完成了谷歌所要做的任何事情(http://developer.android.com/reference/android/app/ListFragment.html关键字屏幕布局)

更新: 我不确定是否必须更改main_activity.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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
</RelativeLayout>

我没有考虑那里的片段,不知道是否需要这个片段。昨天我尝试了一些功能来详细了解我的问题。我使用了getView()。isShown()并返回FALSE - 这对我来说似乎不对,但我不知道这里有什么问题......

3 个答案:

答案 0 :(得分:0)

您的ListView ID必须是ListFragment中的@android:id / list。 也许您还应该将super.setListAdapter替换为setListAdapter。

答案 1 :(得分:0)

嘿这是正确使用CustomAdapter的片段:

private class MyCustomAdapter extends BaseAdapter {

        private ArrayList<String> mData = new ArrayList<String>();
        private LayoutInflater mInflater;

        public MyCustomAdapter() {
            mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        public void addItem(final String item) {
            mData.add(item);
            notifyDataSetChanged();
        }

        @Override
        public int getItemViewType(int position) {
          if(position < LIST_ITEM_TYPE_1_COUNT)
              return LIST_ITEM_TYPE_1;
          else
              return LIST_ITEM_TYPE_2;
        }

        @Override
        public int getViewTypeCount() {
            return LIST_ITEM_TYPE_COUNT;
        }

        @Override
        public int getCount() {
            return mData.size();
        }

        @Override
        public String getItem(int position) {
            return mData.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            int type = getItemViewType(position);
            if (convertView == null) {
                holder = new ViewHolder();
                switch(type) {
                    case LIST_ITEM_TYPE_1:
                        convertView = mInflater.inflate(R.layout.list_item_type1, null);
                        holder.textView = (TextView)convertView.findViewById(R.id.list_item_type1_text_view);
                        break;
                    case LIST_ITEM_TYPE_2:
                        convertView = mInflater.inflate(R.layout.list_item_type2, null);
                        holder.textView = (TextView)convertView.findViewById(R.id.list_item_type2_button);
                        break;
                }
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.textView.setText(mData.get(position));
            return convertView;
        }

    }

    public static class ViewHolder {
        public TextView textView;
    }

}

答案 2 :(得分:0)

审核后 Blank ListView with SimpleCursorAdapter http://developer.android.com/samples/CustomChoiceList/src/com.example.android.customchoicelist/MainActivity.html http://developer.android.com/samples/CustomChoiceList/res/layout/sample_main.html

我找到了解决方案 - 到目前为止一切正常。我刚搞砸了布局文件: ListView作为TextView的内容都具有值“match_parent” - 因此没有足够的布局空间用于其他组件。布局文件中首先出现的组件会覆盖其他所有内容。 我将布局文件调整为:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_weight="1">
</ListView> 
<TextView android:id="@android:id/empty"
           android:layout_width="match_parent"
           android:layout_height="fill_parent"
           android:background="#FF0000"
           android:text="No data">
</TextView>

 <TextView
    android:id="@+id/last_update"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
</TextView>

</LinearLayout>

一切正常。 NOT 使用活动的片段布局 - 它应该有自己的布局,否则会导致错误。 谢谢大家的帮助。

RGDS

Flizz