OnItemSelectedListener in a fragment that uses a custom adapter

So, I’ve been dealing with this for several days and simply can’t get it to work. I have an Activity that displays a fragment, and that Fragment is a member of the list of fragments that I view with the ViewPager. The fragment itself consists of a TextView and a ListView. The ListView is populated from the user adapter.

What I'm trying to do is pass the OnItemSelected event back to the Fragment where it is being processed. For me, it's probably best to just go and show the code here.

This action

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) {
}

This is a snippet:

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 . ?

: ListView ( , , ). , OnItemSelectedListener , . , , , OnItemSelectedListener.

Edit2: . , . - . OnItemSelected . , -, , , . , , . , .

, NPE . ListView, , , .

+5
5

listView.setOnItemSelectedListener(this)? ListView, ...

:

listMain.setOnItemSelectedListener(this);
+2

, Callback, , . - :

public class ModuleFragment extends ListFragment {
   //...
    private OnModuleSelectedListener mdListener;

// this method makes sure my activity implements my interface. If not I show an error
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mdListener = (OnModuleSelectedListener) activity;
            Log.d(TAG, "OnModuleSelectedListener Implemented !");
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                + " must implement OnSqSelectedListener");
        }
    }
// This is the standard onListItemClick, I use it to get data I need and give them to the Listener
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        l.getItemAtPosition(position);
        HashMap<String, String> map = (HashMap<String, String>) l
            .getItemAtPosition(position);
        mdId = map.get("id");
        mdName = map.get("name");
        mdListener.onModuleSelected(mdId,mdName);

    }

    public interface OnModuleSelectedListener {
        public void onModuleSelected(String mdId, String mdName);
    }
}

:

public class Main extends Activity implements OnModuleSelectedListener{
//...
    public void onModuleSelected(String mdId, String mdName) {
            //.. I do whatever I want with what I get from the list
    }
}

, . , .

+1

- . , , onitemselected . , , . :

list = (ListView) vp.getRootView().findViewById(R.id.listMain);
list.setOnItemSelectedListener(this);

- , , . , NPE, . , , . .

, , viewpager ( .. , ) ListFragment... ListFragment , - , ListFragment.

0

FragmentActivity OnItemSelectedListener, , . onItemSelected() ( ).

0

Embedding the interface in the parent activity of the fragment will solve your problem. For instance. TestFragment contains the TestFragmentListener interface. Embed this listener interface in your parent activity and hold the interface link in the snippet to execute the callback method. OnItemSelectedListener calls back the parent activity and processes the rest as usual. See the sample code below.

public final class TestFragment extends Fragment {

    TextView title;
    ListView listView;
    TestFragmentListener mActivity;
    TestAdapter adapter;

    public interface TestFragmentListener {
        public void onItemSelected(Object o);
    }

    public static TestFragment newInstance(String content) {
        TestFragment fragment = new TestFragment();
        return fragment;
    }

    @Override
    public void onAttach(Activity activity) {

        try {
            mActivity = (TestFragmentListener) activity;

        } catch (ClassCastException e) {
            Log.e("Invalid listerer", e.getMessage());
        }

        super.onAttach(activity);
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mActivity = null;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View vw = inflater.inflate(R.layout.layout, container, false);

        title = (TextView) vw.findViewById(R.id.textView1);
        listView = (ListView) vw.findViewById(R.id.listView1);

        return vw;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {

        TestAdapter adapter = new TestAdapter();

        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> arg0, View arg1,
                    int position, long arg3) {
            }
        });

        listView.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                mActivity.onItemSelected(arg2);

            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub

            }
        });
        super.onActivityCreated(savedInstanceState);
    }

private class TestAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return 100;
        }

        @Override
        public Object getItem(int arg0) {
            return null;
        }

        @Override
        public long getItemId(int arg0) {
            return arg0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup container) {

            TextView tv = new TextView((Activity) mActivity);
            tv.setText(Integer.toString(position));
            return tv;
        }
    }

}
0
source

All Articles