使用自定义适配器的片段中的OnItemSelectedListener

use*_*018 5 android android-listview android-fragments

所以我现在已经玩了好几天了,似乎无法让它发挥作用.我有一个显示片段的活动,而片段是我使用ViewPager翻阅的片段列表的成员.Fragment本身由TextView和ListView组成.ListView从自定义适配器填充自身.

我想要做的是将OnItemSelected事件传递回处理它的Fragment.我可能更好地继续在这里显示代码.

这是活动

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) {
}
Run Code Online (Sandbox Code Playgroud)

这是碎片:

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");
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:ListViews必须位于各自的片段中(因为它们将分别显示在不同的活动以及上面列出的活动中).这里最大的问题是我无法在Activity中设置OnItemSelectedListener,因此事件永远不会被触发.我已经完成并运行了所有代码,只是OnItemSelectedListener不起作用.

编辑2:明天我将为这个问题增加一笔赏金.鉴于此,我认为我会更加隐含正确答案的范围.正确的答案不会暗示UI布局或演示文稿的任何重大变化.正确的答案会将OnItemSelected事件传递给Fragment并在那里处理.答案不会让我用一行一行的代码加载我的Activity,以实现我认为只有几行可行的东西.更优雅的答案显然更具吸引力.感谢任何看过这个的人.

这里的问题是我的活动中有NPE.如何将其指向存在于与其所在类的布局不同的布局中的ListView.

Sam*_*Sam 2

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

并在您的片段中添加:

listMain.setOnItemSelectedListener(this);
Run Code Online (Sandbox Code Playgroud)