そのため、私はこれを数日間いじっていますが、うまく機能しないようです。フラグメントを表示するアクティビティがあり、そのフラグメントは、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) {
}
これはフラグメントです:
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 が正しく表示され、すべてが機能すると仮定してみましょう。正しく動作していない唯一のことは、アクティビティの OnItemSelected イベントがまったく発生していないことです...フラグメントの OnItemSelected イベントはなおさらです。ここで何が間違っていますか?
編集: ListViews はそれぞれの Fragments にある必要があります (上記の別のアクティビティと同様に個別に表示されるため)。ここでの最大の問題は、Activity で OnItemSelectedListener を設定できないため、イベントが発生しないことです。その時点までのすべてのコードを実行して実行していますが、機能しないのは OnItemSelectedListener だけです。
Edit2: 明日、この質問に報奨金を追加します。それを踏まえて、私は正解の範囲についてより暗黙的になると思いました. 正解は、UI のレイアウトや表示に劇的な変更を示唆するものではありません。正解は OnItemSelected イベントを Fragment に渡し、そこで処理されます。答えは、コードの行ごとにアクティビティをロードして、ほんの数行で実行できると感じることを達成することではありません。よりエレガントな答えは、明らかにより魅力的です。これを見てくれている人に感謝します。
ここでの問題は、アクティビティで NPE が発生することです。クラスのレイアウトとは異なるレイアウトに存在する ListView を指すにはどうすればよいですか。