【问题标题】:implementing a list within my fragment在我的片段中实现一个列表
【发布时间】:2014-11-13 04:22:24
【问题描述】:

所以我最近开始着手进行 android 开发,经过一番摔跤和未能让这个工作我认为 id 由你们和 gals 运行它。我希望你们中的任何人都解决了类似的问题

我有一个片段,其布局是显示一个文本视图和一个项目列表,如下所示:

Historical data
Item1    20
item2    30
item3    40

这包括操作栏上的一个按钮,该按钮将允许用户添加更多项目和一个数字。我无法实现上述行为。我能够实现一个适配器,它最终显示如下:

Historical data
    Item1    20
Historical data
    item2    30
Historical data
    item3    40

任何想法我该怎么做?

Myfragment.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="wrap_content"
    android:orientation="vertical" >

    <TextView
        style="?android:listSeparatorTextViewStyle"
        android:textSize="18sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/weight_history_label" />

    <RelativeLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"  >


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

            android:textStyle="bold"
            android:paddingLeft="4dp"
            android:paddingRight="4dp"
            android:text="Weigh in Date" />

        <TextView
            android:id="@+id/amount"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/item"

            android:inputType="numberDecimal"
            android:paddingLeft="4dp"
            android:paddingRight="4dp"
            android:paddingTop="4dp"
            android:text="Weight Amount " />

  </RelativeLayout>
</LinearLayout>

我有一类物品:

Items.java
public class NewEntry {
    private String mName;
    private int mNumber;

    public NewEntry(){
        ....

    }

getter/setter }

然后在我的fragment.java中

myFragment.java


public class MyFragment extends ListFragment {

    private ArrayList<Items> mEntries;
    MenuItem test;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //get all the entries and store them on mEntries
        mEntries = EntriesLab.get(getActivity()).getWeighInEntries();
        setHasOptionsMenu(true);

        ItemAdapter adapter = new ItemAdapter(mEntries);
        setListAdapter(adapter);
    }

    /interface to talk to activity
    public interface onButtonClicked {
        public void onWeighInButtonClicked(View v);
    }

    private class ItemAdapter extends ArrayAdapter<Items> {

        public ItemAdapter(ArrayList<Items> items) {
            super(getActivity(), 0, items);
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // If we weren't given a view, inflate one
            if (convertView == null) {
                convertView = getActivity().getLayoutInflater()
                    .inflate(R.layout.Myfragment, null);
            }
            Items c = getItem(position);
            TextView titleDateView =
                    (TextView)convertView.findViewById(R.id.name);
            titleDateView.setText(c.getDate().toString());
          //  Log.i("WeighInFragment: ", "###current Weight " + c.getDate().toString());
            TextView titleWeightView =
                    (TextView)convertView.findViewById(R.id.witem);


           titleWeightView.setText(""+c.getWeight());

            return convertView;

        }
    }
}

所以我想做的是只实现一次我的标签,然后显示项目列表!无论我尝试什么,我总是会得到一个列表: 标签 项目价值 标签 项目价值 标签 项目价值 ...

【问题讨论】:

    标签: android android-layout android-fragments android-listview android-listfragment


    【解决方案1】:

    问题在于,您使用 每个 列表项的标签来膨胀 XML。这就是为什么你每次都得到标题的原因。在 getView 内部膨胀的 XML 应该只用于您的单个项目,而不是列表上方的标签。

    尝试在片段中覆盖 onCreateView 而不是 onCreate。在该函数中,您可以扩展一个包含您的标签和 ListView 的 XML 文件。然后为这些项目创建一个单独的 XML,其中包含您的 RelativeLayout 及其两个 TextView 子项。

    编辑:

    对不起,让我更完整。在您的 onCreateView 中,扩展完整片段的 XML,其中应包括 ListView。由于您使用的是 ListActivity,因此请确保 ListView 的 id 是 android:id/list。这应该看起来像

    <?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="wrap_content"
        android:orientation="vertical" >
    
        <TextView
            style="?android:listSeparatorTextViewStyle"
            android:textSize="18sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/weight_history_label" />
    
        <ListView android:id="@id/android:list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#00FF00"
            android:layout_weight="1"
            android:drawSelectorOnTop="false"/>
    </LinearLayout>
    

    现在创建一个单独的 list_item.xml 包含您的 RelativeLayout:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <TextView android:id="@+id/item"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
    
            android:textStyle="bold"
            android:paddingLeft="4dp"
            android:paddingRight="4dp"
            android:text="Weigh in Date" />
    
        <TextView
            android:id="@+id/amount"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/item"
    
            android:inputType="numberDecimal"
            android:paddingLeft="4dp"
            android:paddingRight="4dp"
            android:paddingTop="4dp"
            android:text="Weight Amount " />
    
    </RelativeLayout>
    

    最后,您的 onCreateView 是将适配器附加到 ListView 的地方:

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //get all the entries and store them on mEntries
        mEntries = EntriesLab.get(getActivity()).getWeighInEntries();
        setHasOptionsMenu(true);
    
        View rootView = inflater.inflate(R.layout.my_fragment, container, true);
        setListAdapter(new ItemAdapter(mEntries));
        return rootView;
    }
    

    【讨论】:

    • 我应该在哪里调用我的适配器?
    • 您只需像以前一样创建适配器。 Android 将调用 getView 来获取列表中的每个项目,现在这些项目将只有日期和数量,而不是标题。
    • 如果我必须分离在不同活动中使用不同布局的列表视图会怎样?我相信 ID:
    • 如果您在谈论不同的活动,那么在每个活动中为 ListViews 使用相同的视图 ID 就可以了。视图 ID 并不神奇;它仅用于在其他事物中查找视图。因此,当您说 activity.findViewById(android.R.list) 时,它只会查看该活动的视图内部。您不必担心当时不在屏幕上的其他活动中的视图。
    【解决方案2】:

    您可以使用adapter.add 方法将新项目添加到列表中,因为您已将列表设置为使用适配器:setListAdapter(adapter)

    因此,您创建一个新的NewEntry 实例,使用它的setter 并在每次用户点击您的button (onClick) 时使用adapter.add 添加它。

    最后,致电adapter.notifyDataSetChanged 更新您的列表数据。

    【讨论】:

    • 为此,从 list_row_layout 中删除标签。把它放在主布局中。
    • @user3291939 按照上面的评论删除你的“!”,我是来帮忙的,尊重别人
    • 完成,这是我的主要布局。我不确定我可以在哪里托管标签?
    【解决方案3】:

    我想做的是只执行一次我的标签,然后显示项目列表!

    为此,您需要将 LABEL 放在 mainLayout 中

    所以布局应该是这样的:

    主布局

    <?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:orientation="vertical" >
    
        <!-- Put Label here -->
        <TextView
            style="?android:listSeparatorTextViewStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/weight_history_label"
            android:textSize="18sp" />
    
        <!-- Your listview -->
        <ListView
            android:id="@+id/activity_main_menu_listview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:background="#ffffff"
            android:cacheColorHint="#00000000"
            android:divider="@android:color/transparent" >
        </ListView>
    
    </LinearLayout>
    

    列表行布局(list_row.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="wrap_content"
        android:orientation="vertical" >
    
    
    
            <TextView android:id="@+id/item"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="bold"
                android:layout_weight=".5"
                android:paddingLeft="4dp"
                android:paddingRight="4dp"
                android:text="Weigh in Date" />
    
            <TextView
                android:id="@+id/amount"
                android:layout_width="wrap_content"
                android:layout_weight=".5"
                android:layout_height="wrap_content"
                android:inputType="numberDecimal"
                android:paddingLeft="4dp"
                android:paddingRight="4dp"
                android:paddingTop="4dp"
                android:text="Weight Amount " />
    
    </LinearLayout>
    

    然后你需要在getView方法中膨胀这个布局:

    if (convertView == null) {
           convertView = getActivity().getLayoutInflater()
                        .inflate(R.layout.list_row, null);
    }
    

    【讨论】:

    • LinearLayout 是否支持 android:layout_below 属性到子级?
    • 很有趣,所以 Myfragment.xml 将成为 Main 布局,然后我必须创建一个 list_row.xml 并在 getView 上调用它?
    • 是的...并在 Activity/Fragment 中膨胀 Myfragment
    • 我对我在哪里调用 Myfragment 感到困惑?在 oncreate 上?
    • 在 onCreate 中是。 Follow this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2019-09-06
    • 2015-09-03
    相关资源
    最近更新 更多