Android:使用按钮将项目添加到Fragment中的ListView

时间:2017-03-25 00:47:42

标签: android

我知道很多人都提出过这个问题,或者说与之非常相似的问题,但是我读过的所有回复都尝试了我的应用程序仍然无效。它不会崩溃,但圆形加载标志会无限期地继续下去。

我现在拥有的是一个包含按钮和ListView的片段。我希望能够在单击按钮时添加新项目。

这是我的MainActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(findViewById(R.id.container) != null) {
    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new ListFragment())
                .commit();
          }
        }
     }     
   }

我的片段:

public class ListFragment extends Fragment implements View.OnClickListener {

private ArrayList<String> listItems = new ArrayList<String>();
private ArrayAdapter<String> myListAdapter;
private ListView listView;

public ListFragment() {

}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    // The ArrayAdapter will take data from a source and
    // use it to populate the ListView it's attached to.
    myListAdapter = new ArrayAdapter<String>(
            getActivity(),
            R.layout.fragment_element_list,
            R.id.list_item_textview,
            listItems);

    View rootView = inflater.inflate(R.layout.fragment_list, container, false);

    listView = (ListView) rootView.findViewById(
            R.id.listview_list);
    listView.setAdapter(myListAdapter);

    Button b = (Button) getView().findViewById(R.id.button);
    b.setOnClickListener(this);

    return rootView;

}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.button:
            listView.setAdapter(myListAdapter); //Adds to the List View
            listItems.add("New Item");
            break;
    }

}
}

ActivityMain.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

FragmentList.xml:

<FrameLayout 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=".ListFragment">

<Button
    android:id="@+id/button"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="Add" />

<ListView
    android:id="@+id/listview_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

</FrameLayout>

Fragment_element_list.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"
android:id="@+id/list_item_textview">
</TextView>

我为我的重复性问题道歉。我还在学习Android,非常感谢任何帮助。

编辑:这是我到目前为止所做的更改。唯一出现的是页面加载器。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    // The ArrayAdapter will take data from a source and
    // use it to populate the ListView it's attached to.
    myListAdapter = new ArrayAdapter<String>(
            getActivity(),
            R.layout.fragment_element_list,
            R.id.list_item_textview,
            listItems);

    View rootView = inflater.inflate(R.layout.fragment_list, container, false);

    listView = (ListView) rootView.findViewById(
            R.id.listview_list);
    listView.setAdapter(myListAdapter);

    Button b = (Button) rootView.findViewById(R.id.button);
    b.setOnClickListener(this);

    return rootView;

}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.button:
            listItems.add("New Item");
            myListAdapter.notifyDataSetChanged();
            break;
    }

}

我也在logcat中找到了: 03-25 10:22:25.343 5617-5617/com.example.kristindiep.appmanager E/ViewRootImpl: sendUserActionEvent() mView == null

4 个答案:

答案 0 :(得分:0)

尝试清除适配器中的项目,然后调用notifyDataSetChanged()方法:

{{! anything}}

答案 1 :(得分:0)

删除。来自onclick的listview.setadapter() 并将其添加到createView

并加入onclick() -

listItems.add(); adapter notifyDataSetChanged();

答案 2 :(得分:0)

我发现了两件事:

1.不要在getView()方法上使用onCreateView,请使用刚刚夸大的视图:

Button b = (Button) rootView.findViewById(R.id.button);
b.setOnClickListener(this);

2.您的onClick方法应如下所示:

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.button:
            listItems.add("New Item");
            myListAdapter.notifyDataSetChanged();
            break;
    }
}

答案 3 :(得分:0)

想出来!这是因为ListFragment是Android中的一个内置类,所以它不喜欢我正在“重新定义”它。