所以我已经玩了几天了,但似乎无法让它发挥作用。我有一个显示片段的活动,并且该片段是我使用 ViewPager 翻页的片段列表的成员。Fragment 本身由 TextView 和 ListView 组成。ListView 通过自定义适配器填充自身。
我想要做的是将 OnItemSelected 事件传递回处理它的片段。对我来说,继续在这里显示代码可能会更好。
这是活动
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) {
}
这是片段:
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");
}
为简洁起见,省略了一些行。让我们假设片段正确显示并且一切正常。唯一不能正常工作的是 Activity 中的 OnItemSelected 事件根本没有触发……更不用说片段中的 OnItemSelected 事件了。我在这里做错了什么?
编辑:ListViews 必须在它们各自的片段中(因为它们将单独显示在不同的活动以及上面列出的活动中)。这里最大的问题是我无法在我的 Activity 中设置 OnItemSelectedListener,因此该事件永远不会被触发。我已经完成并运行了之前的所有代码,只是 OnItemSelectedListener 不起作用。
编辑2:我明天会为这个问题增加一个赏金。鉴于此,我认为我会在正确答案的范围上更加隐含。正确的答案不会暗示 UI 布局或呈现方式有任何显着变化。正确答案会将 OnItemSelected 事件传递给 Fragment 并在那里进行处理。答案不会让我用一行又一行的代码加载我的 Activity 来实现我认为只需几行就可以做到的事情。更优雅的答案显然更具吸引力。感谢任何看到这个的人。
这里的问题是我在我的活动中获得了 NPE。如何将它指向一个 ListView,该 ListView 存在于与其所在类的布局不同的布局中。