简体   繁体   中英

How implement onClick in Fragment?

final ArrayList<User> allBoxerData= new ArrayList<User>();

        allBoxerData.add(new User("Ramon \nDekkers",R.drawable.ramonfinalmej));
        allBoxerData.add(new User("Sergio \nMartínez",R.drawable.sergiomej1));
        allBoxerData.add(new User("Kiko \nMartínez",R.drawable.kikomej1));
        allBoxerData.add(new User("Roberto \nSantos",R.drawable.robertofinal));
        allBoxerData.add(new User("Dani \nCuevas",R.drawable.danimej1));
        allBoxerData.add(new User("Roman \nVardanyan",R.drawable.romanfinal));
        allBoxerData.add(new User("Ivan \nSalcines",R.drawable.ivanred));
        allBoxerData.add(new User("Eva María \nNaranjo",R.drawable.evacuadrado));
        allBoxerData.add(new User("Manzy \nPauwells",R.drawable.manzymej1));
        allBoxerData.add(new User("Lara \nMartín",R.drawable.laramej1));
        allBoxerData.add(new User("Antonio \nRodríguez",R.drawable.antoniomej));
        allBoxerData.add(new User("Katharina \nThanderz",R.drawable.katmej1));


        mylist = (ListView) view.findViewById(R.id.mylist);

        usersAdapter = new UsersAdapter(getActivity(),allBoxerData);


        mylist.setAdapter(usersAdapter);
        usersAdapter.notifyDataSetChanged();

        mylist.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View v, final int position, long id) {
            //Log.i("List View Clicked", "**********");
            if (position==1) {
                Toast.makeText(getActivity(), "Listttt View Clicked:" + position, Toast.LENGTH_LONG).show();
            }
        }
    });

What is the problem? My application doesn't shows me my Toast . This code is in extends Fragment , and I have a listview . I need that when I click 1 item in my listview I go to other Fragment , but that does not work.

public class UsersAdapter extends BaseAdapter {


    private static LayoutInflater inflater = null;
    public List<User> allUsers;

    private Context context;

    /*************
     * Constructor
     *****************/
    public UsersAdapter(Context ctx, ArrayList<User> data) {


        context = ctx;
        allUsers = data;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }


    @Override
    public int getCount() {
        return allUsers.size();
    }

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

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

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

        View rowView = convertView;

        UserViewHolder holder = new UserViewHolder();

        final User user = allUsers.get(position);


        if(convertView==null)
        {
            rowView = inflater.inflate(R.layout.boxer_item, null);
            holder.name = (TextView) rowView.findViewById(R.id.txt_name);
            holder.icon = (ImageView) rowView.findViewById(R.id.img_user);

            rowView.setTag(holder);
        }
        else
        {
            holder = (UserViewHolder) rowView.getTag();
        }




        holder.name.setText(user.getName());

        Glide.with(context).load(user.getImage()).into(holder.icon);


        rowView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
              //  Toast.makeText(context, "You Clicked " + user.getName(), Toast.LENGTH_SHORT).show();

               if (user.getName().equals("Ramon \nDekkers")) {


                    Toast.makeText(getActivity(), "Listttt View Clicked:" + position, Toast.LENGTH_LONG).show(); // THIS WORKS BUT I NEED GO TO OTHER FRAGMENT. 

               }
            }
        });
        return rowView;
    }


    private static class UserViewHolder {
        public ImageView icon;
        public TextView name;

    }
}

Change your Context like this.

private AppCompatActivity context;

Change your UsersAdapter constructor

public UsersAdapter(AppCompatActivity ctx, ArrayList<User> data) {
  //Your code
}

then in your click listener add the code to go to next fragment

rowView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
          //  Toast.makeText(context, "You Clicked " + user.getName(), Toast.LENGTH_SHORT).show();
        Fragment fragment = new NextFragment();
        FragmentManager fragmentManager = context.getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.your_content_frame, fragment);
        fragmentTransaction.addToBackStack(null); //If you want to add to back stack
        fragmentTransaction.commit();
        }
    });

try this:

rowView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

           Fragment fragment = new NextFragment();
           FragmentTransaction fragmentTransaction = getfragmentManager().beginTransaction();
           fragmentTransaction.replace(/*This needs to bee your fragment container*/, fragment);
           fragmentTransaction.addToBackStack(null);
           fragmentTransaction.commit();
        }
     }
 });

For the mylist.setOnItemClickListener(new AdapterView.OnItemClickListener() to get called you have to remove that click listener.

rowView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
      //  Toast.makeText(context, "You Clicked " + user.getName(), Toast.LENGTH_SHORT).show();

       if (user.getName().equals("Ramon \nDekkers")) {


            Toast.makeText(getActivity(), "Listttt View Clicked:" + position, Toast.LENGTH_LONG).show(); // THIS WORKS BUT I NEED GO TO OTHER FRAGMENT. 

       }
    }
});

if you have an RowClickListener the touches will be handled there and not in the ItemClickListener

UPDATE
and to open a fragment from fragment you need to

rowView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

           Fragment fragment = new NextFragment();
           FragmentManager fragmentManager = context.getFragmentManager();
           FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
           fragmentTransaction.replace(R.id.your_content_frame, fragment);
           fragmentTransaction.addToBackStack(null); //If you want to add to back stack
           fragmentTransaction.commit();
        }
     }
 });

When you need to get Support fragment manager call :

FragmentManager fragManager = myContext.getSupportFragmentManager(); //If using fragments from support v4

or

FragmentManager fragManager = myContext.getFragmentManager();

You are done.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM