当前位置: 首页 > 知识库问答 >
问题:

在片段中使用列表视图

丌官丰羽
2023-03-14

我有一个抽屉布局片段(在主活动中),它显示了一个可扩展的列表,当我点击扩展项目的子项时,会出现一个弹出窗口。这个具有自定义布局的弹出窗口包含文本视图、列表视图和2个按钮。

我给列表视图提供了id:android:id=“@android:id/list”,并在onCreateView函数中从视图组返回空值,如下所示:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {    
        View rootView = inflater.inflate(R.layout.fragment_settings, null);

并使类扩展的片段不是列表片段

我执行了前面的3个步骤,以避免出现“Content has view with id attribute'android.R.id.list'不是ListFragment中的ListView类”错误

但我仍然有NullPointerException错误指向

failListView.setAdapter(adapter);

当点击“故障保护设置”项时

我看到了一些建议,但它们都没有得到有用的,比如rootView. findViewById?()not getActive(). findViewById()==

尽管如此,我还是尝试将这个片段添加到onActivityCreated函数中

  TestFailsafeAdapter adapter = new TestFailsafeAdapter(getActivity().getApplicationContext(),
      R.layout.dialog,R.id.textView1,
      getResources().getStringArray(R.array.failsafe_list));
    failListView.setAdapter(adapter);

任何帮助都将不胜感激。

以下是弹出窗口(dialog.xml)中使用的自定义布局:

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


    <LinearLayout
        android:id="@+id/headers_container"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:layout_marginTop="5dp"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text="FailSafe"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="35dp"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/textView1"
            android:text="On"
            android:textSize="16sp" />

    </LinearLayout>


     <ListView
        android:id="@android:id/list"
        android:layout_width="wrap_content"
        android:layout_height="350dp"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/headers_container"
        android:background="#ffeeaa" >
    </ListView> 


    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_below="@android:id/list"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/dialogButtonReset"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp"
            android:layout_marginTop="5dp"
            android:text="Reset" />

        <Button
            android:id="@+id/dialogButtonSend"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp"
            android:layout_marginTop="5dp"
            android:text="Send" />
    </LinearLayout>

</RelativeLayout>

以下是具有可绘制布局的可扩展列表的片段(SettingsFragment.java):

public class SettingsFragment extends Fragment {


ExpandableListAdapter listAdapter;
ExpandableListView expListView;
List<String> listDataHeader;
HashMap<String, List<String>> listDataChild;

int position = 0;
ListView failListView = null;


public SettingsFragment() {
}


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

    // View rootView = inflater.inflate(R.layout.fragment_settings, container, false);
    View rootView = inflater.inflate(R.layout.fragment_settings, null);     


     failListView = (ListView) rootView.findViewById(android.R.id.list);


  TestFailsafeAdapter adapter = new TestFailsafeAdapter(getActivity().getApplicationContext(),
  R.layout.dialog,R.id.textView1, getResources().getStringArray(R.array.failsafe_list));
  failListView.setAdapter(adapter);

     return rootView;
}



@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);


    // get the listview
    expListView = (ExpandableListView) getActivity().findViewById(R.id.lvExp);

    // preparing list data
    prepareListData();

    listAdapter = new ExpandableListAdapter(getActivity(), listDataHeader, listDataChild);

    // setting list adapter
    expListView.setAdapter(listAdapter);

    // Listview Group click listener
    expListView.setOnGroupClickListener(new OnGroupClickListener() {


        public boolean onGroupClick(ExpandableListView parent, View v,
                int groupPosition, long id) {
            return false;
        }
    });

    // Listview Group expanded listener
    expListView.setOnGroupExpandListener(new OnGroupExpandListener() {

        @Override
        public void onGroupExpand(int groupPosition) {
            Toast.makeText(getActivity(),
                    listDataHeader.get(groupPosition) + " Expanded",
                    Toast.LENGTH_SHORT).show();
        }
    });

    // Listview Group collasped listener
    expListView.setOnGroupCollapseListener(new OnGroupCollapseListener() {

        @Override
        public void onGroupCollapse(int groupPosition) {
            Toast.makeText(getActivity(),
                    listDataHeader.get(groupPosition) + " Collapsed",
                    Toast.LENGTH_SHORT).show();

        }
    });

    // Listview on child click listener
    expListView.setOnChildClickListener(new OnChildClickListener() {

        @Override
        public boolean onChildClick(ExpandableListView parent, View v,
                final int groupPosition, final int childPosition, long id) {
            // TODO Auto-generated method stub


            if(listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition).equals("USB") ){


                FragmentManager manager = getFragmentManager();

                /** Instantiating the DialogFragment class */
                AlertDialogRadio alert = new AlertDialogRadio();

                /** Creating a bundle object to store the selected item's index */
                Bundle b  = new Bundle();

                /** Storing the selected item's index in the bundle object */
                b.putInt("position", position);

                /** Setting the bundle object to the dialog fragment object */
                alert.setArguments(b);

                /** Creating the dialog fragment object, which will in turn open the alert dialog window */
                alert.show(manager, "alert_dialog_radio");

            }   


            if(listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition).equals("Failsafe Setup") ){

                Toast.makeText(getActivity()," Failsafe Setup",Toast.LENGTH_SHORT).show();


                // create a Dialog component
                final Dialog dialog = new Dialog(getActivity());

                //tell the Dialog to use the dialog.xml as it's layout description
                dialog.setContentView(R.layout.dialog);
                dialog.setTitle("Failsafe Setup");


                ListView failListView = (ListView) dialog.findViewById(android.R.id.list);
                Button dialogButtonReset = (Button) dialog.findViewById(R.id.dialogButtonReset);
                Button dialogButtonSend = (Button) dialog.findViewById(R.id.dialogButtonSend);


                dialogButtonReset.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(getActivity()," Failsafe Reset",Toast.LENGTH_SHORT).show();

                    }
                });

                dialogButtonSend.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(getActivity()," Failsafe Send",Toast.LENGTH_SHORT).show();
                    }
                });

                dialog.show();

            }

            return false;
        } // end of OnClickChild method
    });



}


private void prepareListData() {
    listDataHeader = new ArrayList<String>();

    listDataChild = new HashMap<String, List<String>>();  

  // Adding child data
  listDataHeader.add("Connection");
  listDataHeader.add("Mission Limits");
  listDataHeader.add("Compass Calibration");
  listDataHeader.add("Sensor Calibration");
  listDataHeader.add("Failsafe");

 // Adding child data
  List<String> Connection = new ArrayList<String>();
  Connection.add("USB");
  Connection.add("Wi-Fi");


  List<String> MissionLimits = new ArrayList<String>();
  List<String> CompassCalibration = new ArrayList<String>();
  List<String> SensorCalibration = new ArrayList<String>();

  List<String> Failsafe = new ArrayList<String>();
  Failsafe.add("Failsafe Setup");


  listDataChild.put(listDataHeader.get(0), Connection); // Header, Child data
  listDataChild.put(listDataHeader.get(1), MissionLimits); 
  listDataChild.put(listDataHeader.get(2), CompassCalibration); 
  listDataChild.put(listDataHeader.get(3), SensorCalibration); 
  listDataChild.put(listDataHeader.get(4), Failsafe); 

}

}

共有1个答案

夹谷浩博
2023-03-14

NPE在这里:

failListView.setAdapter(adapter);

因为ListViewandroid:id/listid在对话框中。xml布局,它是对话框布局,而不是片段设置中的布局。xml这是设置片段片段布局。

因此,使用对话框的上下文或对象不可能访问onCreateView中的ListView

 类似资料:
  • 我设法创建了一个自定义列表视图,并为每一行添加了一个删除按钮。删除按钮运行良好,当我单击按钮时,该行会从数据库中删除。问题是,当我删除一行时,它会保留在列表中,直到我通过移动到另一个片段来刷新片段并返回,然后它从列表中消失。我想要的是,当我删除一行时,它会立即从列表视图中消失。我尝试了一些解决方案来刷新整个片段或删除完成后的列表视图,但它们不起作用! 这是我为适配器类中的删除按钮编写的代码 之后

  • 我在一个片段中使用ListView,我已经按照Android的指示设置了所有必要的要求,下面是我的XML列表代码 在我的代码中 但是,我仍然得到这个错误 08-20 23:26:26.053:E/AndroidRuntime(30334):致命异常:main 08-20 23:206:26.053:E/Android Runtime“30334”:进程:com.deliveryscience.tr

  • 在我的应用程序中,我有标签的活动(让我们说10个标签)。每个选项卡页都包含和(此ListView中显示的数据是从我的服务器动态加载的)。我使用来显示这些页面。我不想将所有保存在内存中,所以我决定使用(我的适配器类扩展了这些类)。 > 假设选择了第三个选项卡。然后,当我转到第一个选项卡时,应该从头开始为该选项卡创建(这很好,这就是的工作方式),但不恢复该片段以前的状态(例如,不应该滚动到上次访问该时

  • 似乎刷新问题之前讨论过,但没有一个解决方案对我有效。 我正在尝试做的事情:我正在使用FragmentStatePagerAdapter。适配器的每个位置都保存一个片段,该片段具有类似国际象棋的线性布局,每个单元格由CheckedTextView表示。 问题:即使正确存储和分配了值,视图仍然不能刷新,视图中单元格的值也不会得到更新。 我尝试过的建议都不起作用:1。调用Adapter.NotifyDa

  • 问题内容: 给出清单 您可以使用诸如 但是,我想基于代码中其他位置设置的变量来执行此操作。我可以很容易地做到这一点 但是,我该如何为另一个做呢?我尝试用列表建立索引: 但这是行不通的。我也尝试过使用字符串: 但这也不起作用。 这可能吗? 问题答案: 那是为了: 与使用相同。

  • 我正在尝试在MVVMCross Xamarin Adroid应用程序中使用ActionBar。我能够在片段中加载布局,问题是上下文总是指向MainView而不是布局视图。我试图更改上下文,但资源异常。错误是 Java.Lang.NullPointerException:尝试在 null 对象引用上调用虚拟方法 'android.content.res.Resources android.conte