简体   繁体   中英

How do i call a context menu on longclick in a ListView Item?

HomeFragment

imports;

public class HomeFragment extends Fragment {

// Declare Variables
    ListView list;
    TextView text;
    ListViewAdapter adapter;
    EditText editsearch;
    String[] title;
    String[] date;
    String[] status;
    ArrayList<ListCourse> arraylist = new ArrayList<ListCourse>();

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

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

        date = new String[] { "11/01/2011", "10/05/2006", "12/07/2002", "05/04/2011", "01/08/2012",
                          "09/12/2017", "22/06/2024", "31/01/2000", "10/10/2156", "10/02/2006" };

        title = new String[] { "Programação", "Matemática", "Logística",
            "Mobile", "Sistemas Operativos", "iOS", "Android", "Windows",
            "Hardware", "Formação" };

        status = new String[] { " ongoing ", " ongoing ",
            " ongoing ", " standby ", " ongoing ", " ongoing ",
            " ongoing ", " ongoing ", " finished ", " ongoing " };

        // Locate the ListView in listview_main.xml

        list = (ListView) rootView.findViewById(R.id.listview);

        for (int i = 0; i < title.length; i++) 
        {
            ListCourse wp = new ListCourse(date[i], title[i],
                status[i]);
            // Binds all strings into an array
            arraylist.add(wp);
        }

        // Pass results to ListViewAdapter Class
        adapter = new ListViewAdapter(getActivity(), arraylist);

        // Binds the Adapter to the ListView
        list.setAdapter(adapter);

       return rootView;
    }
}

I just need 3 items on the context menu: Like, Comment and Favorite. I tried implementing various tutorials to no avail, my project consist of a MainActivity that has a slidermenu to open some fragments like this one where the list is and where I want to put the context menu.

Here´s my adapter:

public class ListViewAdapter extends BaseAdapter {

    // Declare Variables
    Context mContext;
    LayoutInflater inflater;
    private List<ListCourse> coursepopulatelist = null;
    private ArrayList<ListCourse> arraylist;

    public ListViewAdapter(Context context, List<ListCourse> coursepopulatelist) {
        mContext = context;
        this.coursepopulatelist = coursepopulatelist;
        inflater = LayoutInflater.from(mContext);
        this.arraylist = new ArrayList<ListCourse>();
        this.arraylist.addAll(coursepopulatelist);
    }

    public class ViewHolder {
        TextView title;
        TextView date;
        TextView status;
    }

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

    @Override
    public ListCourse getItem(int position) {
        return coursepopulatelist.get(position);
    }

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

    public View getView(final int position, View view, ViewGroup parent) {
        final ViewHolder holder;
        if (view == null) {
            holder = new ViewHolder();
            view = inflater.inflate(R.layout.listview_item, null);
            // Locate the TextViews in listview_item.xml
            holder.title = (TextView) view.findViewById(R.id.title);
            holder.date = (TextView) view.findViewById(R.id.date);
            holder.status = (TextView) view.findViewById(R.id.status);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }
        // Set the results into TextViews
        holder.title.setText(coursepopulatelist.get(position).getTitle());
        holder.date.setText(coursepopulatelist.get(position).getDate());
        holder.status.setText(coursepopulatelist.get(position).getStatus());

        // Listen for ListView Item Click
        view.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // Send single item click data to SingleItemView Class
                Intent intent = new Intent(mContext, SingleItemView.class);
                // Pass all data rank
                intent.putExtra("title",(coursepopulatelist.get(position).getTitle()));
                // Pass all data country
                intent.putExtra("date",(coursepopulatelist.get(position).getDate()));
                // Pass all data population
                intent.putExtra("status",(coursepopulatelist.get(position).getStatus()));
                // Pass all data flag
                // Start SingleItemView Class
                mContext.startActivity(intent);
            }
        });

        return view;
    }

    // Filter Class
    public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        coursepopulatelist.clear();
        if (charText.length() == 0) {
            coursepopulatelist.addAll(arraylist);
        } 
        else 
        {
            for (ListCourse wp : arraylist) 
            {
                if (wp.getDate().toLowerCase(Locale.getDefault()).contains(charText)) 
                {
                    coursepopulatelist.add(wp);
                }
            }
        }
        notifyDataSetChanged();
    }

}

Are the changes supposed to go in the adapter or the fragment? I tried several times with OnCreateContextMenu and ContextMenuSelectedItem cant get it to work on the fragment, also tried OnLongItemClick. Any help would be appreciated.

You have to set setOnItemLongClickListener() in the ListView:

lv.setOnItemLongClickListener(new OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int pos, long id) {

                // Do stuff here

                return true;
            }
        }); 

Also, you need to set it on the list not inside the adapter (if that was your doubt)

EDIT: You need to do this inside the onCreate() method.

first set your listvieW as follow myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

        myListView.setAdapter(adapter);

then register for MultiChoiceModeListener and override his methods in your liking :)

        myListView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
            @Override
            public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {

            }

            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
               // here you will inflate your CAB
                return true;
            }

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false;
            }

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {

            }
        });

    }

Here is the link

i hope it help

Edit : add a link that could help you

I managed to get one context menu working, right here:

       @Override
       public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);

        AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
        adapter = new ListViewAdapter(getActivity(), arraylist);
        Object item = adapter.getItem(info.position);

        menu.setHeaderTitle("Opções");
        menu.add(0, v.getId(), 0, "Like");
        menu.add(1, v.getId(), 0, "Comment");
        menu.add(2, v.getId(), 0, "Favorite");

        }


        @Override   
        public boolean onContextItemSelected(MenuItem item) {
        if (item.getTitle() == "Like") {
            addLike(item.getItemId());
        } else if (item.getTitle() == "Comment") {

        } else if (item.getTitle() == "Favorite") {
            // code
        } else {
            return false;
        }
        return true;

        }

        public void addLike(int id){

        }

Right after the return rootView in the HomeFragment. Also had to add android:longClickable="true" on the listview.xml or it would never work (I put it into the listviewitem.xml too just in case).

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