2014-02-20 2 views
0

HomeFragmentКак вызвать контекстное меню в longclick в элементе ListView?

импорт;

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; 
    } 
} 

Мне просто нужно 3 элемента в контекстном меню: «Избранное», «Комментарии» и «Избранное». Я попытался реализовать различные учебники безрезультатно, мой проект состоит из MainActivity, у которого есть slidermenu, чтобы открыть некоторые фрагменты, подобные этому, где находится список, и где я хочу поместить контекстное меню.

Here's мой адаптер:

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(); 
    } 

} 

изменения предполагается ли идти в адаптере или фрагмента? Я несколько раз пытался использовать OnCreateContextMenu и ContextMenuSelectedItem, чтобы заставить его работать с фрагментом, а также попытался OnLongItemClick. Любая помощь будет оценена по достоинству.

ответ

0

мне удалось получить один из контекстного меню работать, прямо здесь:

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

     } 

Сразу после возвращения rootView в HomeFragment. Также нужно было добавить android: longClickable = "true" в listview.xml или он никогда не будет работать (я тоже на всякий случай помещал его в listviewitem.xml).

+0

Благодарим вас за редактирование этой строки @BatchyX, как мне получить эти строки из моих фрагментов? Они обычно собираются вместе, даже если я много занимаюсь. Я довольно новичок в этой платформе. – CupcakeFury

+0

Так что, видимо, если я улучшу предложенное редактирование, тогда меня считают автором ... в любом случае, ваша линия имела ведущие пробелы. все, что имеет ведущие пространства, считается кодом. – BatchyX

0

Вы должны установить setOnItemLongClickListener() в ListView:

lv.setOnItemLongClickListener(new OnItemLongClickListener() { 

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

       // Do stuff here 

       return true; 
      } 
     }); 

Кроме того, вы должны установить его в списке не внутри адаптера (если это ваше сомнение)

EDIT: Вы необходимо сделать это внутри метода onCreate().

+0

Должен ли я установить его в адаптере или фрагменте? Я получаю сообщение об ошибке, если я установил его на фрагменте. – CupcakeFury

+0

Почему бы вам не расширить класс ListFragment вместо класса Fragment для вашего списка? Его гораздо проще работать со списками таким образом. – AndyFaizan

+0

Что касается вашего вопроса, вы должны установить прослушиватель кликов в методе onActivityCreated(). Вы можете обратиться к этому коду http://www.easyinfogeek.com/2013/07/full-example-of-using-fragment-in.html – AndyFaizan

0

первым установить ListView, как следовать myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

 myListView.setAdapter(adapter); 

затем зарегистрировать MultiChoiceModeListener и переопределить его методы в своей душе :)

 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

я надеюсь, что это поможет

Редактировать: добавить al чернила, которые могли бы помочь вам

+0

Есть ли другой способ поместить эти кнопки в элемент списка? Как scrollview или viewpager или даже кнопка во всплывающем окне? – CupcakeFury

Смежные вопросы