Fragment中的ListView未显示

4

我有一个应用程序,其中有几个选项卡;与任何一个交互都会调用要显示的片段。不幸的是,当我切换到下面的片段时,我的listView没有出现,尽管相关的列表已被填充。非常感谢您提供的任何帮助。

片段的相关代码:

public class Fragment_1 extends SherlockFragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    //If time permits, I will try to make a Custom Adapter implemented with a TreeSet
    TreeSet<BlacklistWord> theSet =  MainActivity.getInstance().datasource.GetAllWords();
    ArrayList<String> list = new ArrayList<String>();
    for(BlacklistWord i :theSet){
        System.out.println(i.getWord());
        list.add(i.getWord());
    }
    Collections.sort(list);

    //Making BlackList 
    listView = new ListView(getActivity());
    listView.findViewById(R.id.listview);
    adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,  list);
    listView.setAdapter(adapter);
    ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged();
    container.addView(listView);
    return inflater.inflate(R.layout.blacklist, container, false);
    //      return inflater.inflate(R.layout.blacklist, container, false);
}
}

The XML is

<?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" >

<ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</LinearLayout>
4个回答

2

使用以下方式:

public class LListFragment extends ListFragment {

    private String[] line;

    public static final String[] TITLES = { "Henry IV (1)", "Henry V",
            "Henry VIII", "Richard II", "Richard III", "Merchant of Venice",
            "Othello", "King Lear" };

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



        ListView listv = getListView();

        setListAdapter(new ArrayAdapter<String>(getActivity(),
                R.layout.scan_row, R.id.textView1, TITLES));
    }
}

或者你在 XML 中有一个 ListView,那么...
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.llist_layout, container, false);
        // do your view initialization here
        listv = (ListView) view.findViewById(R.id.lineDlist);
        name = (TextView) view.findViewById(R.id.lineName);
        st = (TextView) view.findViewById(R.id.lineSt);


        listv.setAdapter(new ImageAdapter(getActivity(),
                GeneralClass.lineDetails));

        return view;
    }

2

将代码更改为(盲目编码):

public class Fragment_1 extends SherlockFragment {

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    /**
    ** Change the way you get the data. Don't keep references to activities like that.
    **/
    TreeSet<BlacklistWord> theSet =  MainActivity.getInstance().datasource.GetAllWords();
    ArrayList<String> list = new ArrayList<String>();
    for(BlacklistWord i :theSet){
        System.out.println(i.getWord());
        list.add(i.getWord());
    }
    Collections.sort(list);
    View v = inflater.inflate(R.layout.blacklist, container, false);

    listView = view.findViewById(R.id.listview);
    adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,  list);
    listView.setAdapter(adapter);
    return view;
}
}

你的列表视图没有显示是因为你错误地使用了构造函数创建了一个ListView,然后调用了findViewById(它没有任何有用的作用),然后设置了一个适配器,调用了notifyDataSetChanged,最后返回了另一个列表。


嗨,Gunar,谢谢你的回复。当我尝试实现你的解决方案时,由于没有首先在子项的父级上调用“removeView()”,导致抛出了RuntimeException。我应该在MainActivity中执行这个removeView吗? - NumenorForLife
我已发布上面的代码,假设您在父活动中没有进行任何花哨的操作。从视图层次结构的角度来看,片段应该与活动相隔离,反之亦然...我不了解您的业务逻辑,因此无法发表更多评论。 - gunar
我通过使用另一个SO帖子推荐的代码行解决了这个问题:((ViewGroup) listView.getParent()).removeView(listView);。 - NumenorForLife

1
因为您正在创建一个新的ListView,并试图在其中找到您的xml listview作为子项...
相反,使用以下内容:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

    View view = inflater.inflate(R.layout.blacklist, container, false);

    ListView listview = (ListView) view.findViewById(R.id.listview);

    //Making BlackList 
    adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,  list);
    listView.setAdapter(adapter);
    ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged();
    container.addView(listView);

    return view;
}

0

ListView 可见性或显示错误... 请注意,如果您使用扩展 ListFragment 的片段,请使用定义的 listview id,例如 list 并像这样定义它:android:id="@+id/listview

并且在您的 Fragment 类中定义它就像这样:frgView.findViewById(android.R.id.listview);

如果您仍然遇到列表视图可见性问题,请记住更改片段的布局为 <FragmentLayout>

如果您想在项目中使用,请将其添加到下面。

祝您编码愉快...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接