Итак, я играю с этим уже несколько дней и просто не могу заставить его работать. У меня есть действие, которое отображает фрагмент, и этот фрагмент является членом списка фрагментов, которые я просматриваю с помощью ViewPager. Сам фрагмент состоит из 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");
}
Некоторые строки опущены для краткости. Давайте исходить из того, что Фрагменты отображаются правильно и все работает. Единственное, что работает неправильно, это то, что событие OnItemSelected в Activity вообще не срабатывает... тем более событие OnItemSelected во фрагменте. Что я здесь делаю неправильно?
Отредактируйте :ListViews, которые должны находиться в соответствующих Фрагментах (, так как они будут отображаться по отдельности в другом действии, а также в том, что указано выше ). Самая большая проблема здесь заключается в том, что я не могу установить OnItemSelectedListener в своей деятельности, поэтому событие никогда не срабатывает. У меня есть весь код, ведущий к этому моменту, отработанный и работающий, это просто OnItemSelectedListener, который не работает.
Edit2 :Завтра я добавлю награду к этому вопросу. В свете этого я подумал, что буду более неявным в отношении объема правильного ответа. Правильный ответ не предполагает каких-либо кардинальных изменений в макете или представлении пользовательского интерфейса. Правильный ответ передаст событие OnItemSelected фрагменту и будет обработан там.Ответ не заставит меня загружать свою активность строкой за строкой кода, чтобы достичь чего-то, что, как мне кажется, можно -сделать всего несколькими строками. Более элегантные ответы, очевидно, более привлекательны. Спасибо всем, кто взглянет на это.
Проблема здесь в том, что я получаю NPE в своей деятельности. Как указать ему ListView, который существует в макете, отличном от макета класса, в котором он находится.