是否可以从ListView Fragment而不是ListView Adapter获取Button视图?

时间:2013-07-29 17:47:56

标签: android onclicklistener listadapter android-listfragment

我有这个:

enter image description here

其中Red square是包含多个片段的活动,几乎所有片段都是列表,所有片段都有不同的项目,但是由我的自定义ListAdapter类构建。

橙色方块是其中一个片段,实际上它是一个正确的drawer。这个片段从ListFragment扩展,并膨胀一个没有Items的简单xml。

在片段的onActivityCreated内部,我实例化了一个自定义的ListAdapter,我填写了你在截图中看到的项目。

我有几个xml,具体取决于我想要的项目类型,在这里你可以看到其中3个:

  • 按钮标题(绿色方块)
  • 可检查项目(可以在右侧显示已选中图标的项目)
  • 常规标题(说“Díayhora del viaje”)

按钮标题(绿色方块)xml是一个简单的线性布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/menu_row_title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <ImageButton
        android:id="@+id/row_button"
        android:layout_width="45dp"
        android:layout_height="45dp"
        android:padding="10dp" />

    <TextView
        android:id="@+id/row_title"
        android:layout_width="0px"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:minLines="1"
        android:padding="10dp"
        android:textAppearance="@android:style/TextAppearance.Medium"
        android:textStyle="bold" />

</LinearLayout>

我想要做的是从橙色方块(我的自定义ListFragment类)访问按钮以设置单击侦听器。我做了我的研究,我知道我可以从适配器那里做到(我已经成功尝试过),但那是我不想要的,因为在其他菜单中我会有其他按钮表现不同但是它们是要调用同一个侦听器,因为它们是由同一个适配器构建的。

我在给片段膨胀后尝试过:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View fragmentView = inflater.inflate(R.layout.menu_list, null); 
    //Button of location settings
    ((ImageButton)fragmentView.findViewById(R.id.row_button)).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
                //Do here stuff I want to
        }
    }); 
    super.onStart();
    return fragmentView;
}

同样来自onStart

@Override
public void onStart() {
    //Button of location settings
    ((ImageButton)getView().findViewById(R.id.row_button)).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
                //Here my stuff
        }
    }); 
    super.onStart();
}

以及setListAdapter()

之后
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    //A new instance of my own ListAdapter
    MyListAdapter adapter = new MyListAdapter(getActivity());
    //Prepare my items and its propierties within adapter
    //...
    //Set the Adapter
    setListAdapter(adapter);
    //And then try to get the Button view
    //Button of location settings
    ((ImageButton)getView().findViewById(R.id.row_button)).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            //My stuff here
        }
    }); 
}

但是猜猜是什么......我总是在xml膨胀片段时得到同样的错误。如果我删除设置点击监听器的行,它可以工作,但显然按钮什么都不做。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

以下是评论的答案:

您的按钮位于ListView的一行,因此您只能从列表适配器(getView())中找到它。从您的片段中调用findViewById()无法返回ListView中包含的视图。

一种解决方案是在充气时为您的按钮设置标签,然后在点击按钮时根据标签执行某些操作。