所以我几天来一直在玩这个游戏,而且似乎无法让它起作用。我有一个显示片段的活动,并且该片段是我使用ViewPager进行页面浏览的片段列表的成员。片段本身由一个TextView和一个ListView组成。 ListView从自定义适配器填充自身。OnItemSelectedListener在使用自定义适配器的片段中
我想要做的是将一个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,其布局不同于它所在类的布局。
运行打破你的“我不想改变UI”规则的风险,有你没有使用'ListFragment'它默认给你一个方法,'理由覆盖',捕获点击'ListView',因此你可以做我认为你正在尝试做的事情,即处理片段中本地的列表项点击... http://developer.android.com /reference/android/app/ListFragment.html#onListItemClick(android.widget.ListView,android.view.View,int,long) – 2012-07-20 22:27:55
是的,因为ListFragment会填满整个屏幕。在这种情况下,我将在底部有按钮,并在顶部有一个标题TextView – user1449018 2012-07-21 10:20:41
您似乎有事情背对背:您不应该尝试捕获活动中的列表项单击并将它们传播到片段( s),而是直接在相关片段中接收它们。基本上@SalilPandit已经给出了正确的方法。你是否使用'ListFragment'取决于你,但是你认为它“填满整个屏幕”的假设是不正确的;它只是处理列表的一个便利片段,但您可以使它看起来像任何您想要的,只要您至少用'@android:id/list'声明了一个'ListView'。 – 2012-07-21 23:32:08