android - 使用自定义适配器的 fragment 中的 OnItemSelectedListener

标签 android android-listview android-fragments

所以我已经用这个玩了几天,但似乎无法让它工作。我有一个显示 fragment 的 Activity ,该 fragment 是我使用 ViewPager 分页的 fragment 列表的成员。 Fragment 本身由一个 TextView 和一个 ListView 组成。 ListView 从自定义适配器填充自身。

我要做的是将 OnItemSelected 事件传递回处理它的 Fragment。我最好直接在此处显示代码。

这是 Activity

public class DialogInventory extends FragmentActivity implements OnItemSelectedListener {

ViewPager viewPager;
Pager pager;

@Override
protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.dialog_inventory);

    List<Fragment> fragList = new Vector<Fragment>();
    fragList.add(Fragment.instantiate(this, FragmentOne.class.getName()));
    fragList.add(Fragment.instantiate(this, FragmentTwo.class.getName()));
    pager = new Pager(getSupportFragmentManager(), fragList);

    viewPager = (ViewPager) findViewById(R.id.pagerMain);
    viewPager.setAdapter(pager);

    listMain = (ListView) findViewById(R.id.listMain);
    listMain.setOnItemSelectedListener(this);
}

public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    switch (viewPager.getCurrentItem()) {
        case 0:
            FragmentOne fragOne = new FragmentOne();
            fragOne.onItemSelected(parent, view, pos, id);
            break;
        case 1:
            FragmentTwo fragTwo = new FragmentTwo();
            fragTwo.onItemSelected(parent, view, pos, id);
            break;
    }
}
public void onNothingSelected(AdapterView<?> arg0) {
}

这是 fragment :

public class FragmentOne extends Fragment implements OnItemSelectedListener {

View view;
ListView listMain;
ArrayList<String> invItems = new ArrayList<String>();

public FragmentOne() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) {
    view = inflater.inflate(R.layout.fragment_one, viewGroup, false);

    listMain = (ListView) v.findViewById(R.id.listMain);
    listMain.setAdapter(new AdapterItem(getActivity().getApplicationContext(),
        R.layout.tile_item, invItems));
    listMain.setOnItemSelectedListener(this);
    return view;
}
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    Log.i("Test", "hit");
}

为简洁起见,省略了一些行。让我们继续假设 Fragments 正确显示并且一切正常。唯一不能正常工作的是 Activity 中的 OnItemSelected 事件根本没有触发......更不用说 fragment 中的 OnItemSelected 事件了。我在这里做错了什么?

编辑:ListView 必须位于各自的 fragment 中(因为它们将单独显示在不同的 Activity 以及上面列出的 Activity 中)。这里最大的问题是我无法在我的 Activity 中设置 OnItemSelectedListener,因此该事件永远不会被触发。我已经制定并运行了导致该点的所有代码,只是 OnItemSelectedListener 不起作用。

Edit2:我明天会为这个问题增加赏金。鉴于此,我认为我会更加隐含正确答案的范围。正确的答案不会建议对 UI 布局或演示进行任何重大更改。正确答案会将 OnItemSelected 事件传递给 Fragment 并在那里进行处理。答案不会让我用一行又一行的代码加载我的 Activity 来实现我认为只需要几行就可以做到的事情。更优雅的答案显然更吸引人。感谢任何看过这篇文章的人。

这里的问题是我在 Activity 中遇到了 NPE。我如何将它指向存在于与其所在类的布局不同的布局中的 ListView。

最佳答案

你在哪里使用listView.setOnItemSelectedListener(this)?您需要明确通知 ListView 您的 Activity 应该控制 UI 行为...

然后在您的 fragment 中添加:

listMain.setOnItemSelectedListener(this);

关于android - 使用自定义适配器的 fragment 中的 OnItemSelectedListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11527532/

相关文章:

android - 带有 WebView 的 ListView 作为标题自动滚动

java - 调用自定义适配器时出现空点异常 : Android

java - 如何在 Android 中没有 UI 或用户交互的情况下拍摄大量照片?

android - 从电池性能影响的角度来看,SQLite 数据库与基于文件的数据存储

android - 运行时权限检查 API 23+ : Cannot resolve symbol 'Manifest.permission.READ_EXTERNAL_STORAGE'

android - 操作栏选项卡中的 MapFragment

android - 将 FragmentPagerAdapter 作为 fragment 本身的 ViewPager?

android - 将应用程序的 keystore 与具有多个应用程序的旧 keystore 分开

java - EditText 用于过滤 ListView 中的项目。如何?

带有来自 URL 和 TextView 的 ImageView 的 Android ListView