2016-01-13 4 views
0

У меня есть код ниже, чтобы отображать всплывающее меню, когда пользователь нажимает на изображение переполнения в каждом элементе строки. К сожалению, я не знаю, как передать контекст фрагменту, из-за которого onClick() не получил значение контекста. Мне удалось показать всплывающее меню, если я создаю слушатель непосредственно в getView() класса адаптера, но я не могу получить ожидаемый результат, если я передал слушателю фрагмент. Могу ли я узнать, как я могу адаптировать свой код ниже?Android Pass Value от фрагмента до класса адаптера

Моя текущая кодировка, как показано ниже:

public class SubProductCustomAdapter extends BaseAdapter { 
... 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    //RecyclerView (Android 5.0) - To avoid app crash when there are too many records when user scroll 
    ViewHolder viewHolder; 
    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 

    //First Created 
    if(convertView == null) 
    { 
     convertView = mInflater.inflate(R.layout.item_sub_product, null); 
     viewHolder = new ViewHolder(); 

     viewHolder.sub_product_name = (TextView)convertView.findViewById(R.id.txt_pdt_name); 
     viewHolder.popup_menu = (ImageView) convertView.findViewById(R.id.product_overflow); 

     SubRowProducts subRowPro = subRowProducts.get(position); 
     viewHolder.sub_product_name.setText(subRowPro.getSub_product_name()); 

     //Managed to display popup menu using below method 
     /*viewHolder.popup_menu.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       PopupMenu popupMenu = new PopupMenu(context,v); 

       popupMenu.getMenuInflater().inflate(R.menu.drawermenu, popupMenu.getMenu()); 

       popupMenu.show(); 
      } 
     });*/ 

     //Not managed to display popup menu using below method 
     viewHolder.popup_menu.setOnClickListener(new MySubProductListFragment()); 

     //Store object inside convert view 
     convertView.setTag(viewHolder); 

    } 

    else{ 
     //Reused or recycle the convertView 
     viewHolder = (ViewHolder)convertView.getTag(); 
    } 

    //viewHolder.sub_product_name.setText(subRowProducts.get(position).getSub_product_name()); 

    return convertView; 
} 

.

************************************************************************************************************ 

public class MySubProductListFragment extends ListFragment implements View.OnClickListener { 

... 

@Override 
public void onClick(View v) { 

    PopupMenu popupMenu = new PopupMenu(getActivity(),v); 

    popupMenu.getMenuInflater().inflate(R.menu.drawermenu, popupMenu.getMenu()); 

    popupMenu.show(); 

} 

}

ответ

1
  1. Определение интерфейса в классе адаптера с необходимыми методами.
  2. Есть конструктор адаптера, который ожидает ссылку на этот интерфейс
  3. Теперь в пусть ваш класс ListFragment реализовать интерфейс адаптера, а при создании ссылки для вашего адаптера класса перевале this в качестве параметра адаптера конструктора класса.
  4. Из конструктора класса адаптера есть частная ссылка на фрагмент и вызов, который когда-либо нужен.