2017-01-19 4 views
0

У меня есть следующие ListView:Как назвать метод активности в Фрагменте?

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    //CheckBoxAdapter cb = new CheckBoxAdapter(this.getActivity(),R.layout.item, getResources().getStringArray(R.array.products)); 
    //lv.setAdapter(cb); 
    ArrayAdapter<String> arrayAdapter; 
    arrayAdapter = new ArrayAdapter<String>(this.getContext(), android.R.layout.simple_list_item_1, categories); 

    ListView lv = (ListView) this.getActivity().findViewById(R.id.listProduct); 
    lv.setAdapter(arrayAdapter); 

    lv.setOnItemClickListener(
      new AdapterView.OnItemClickListener(){ 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        String type = String.valueOf(parent.getItemAtPosition(position)); 
        Toast.makeText(getContext(), parent.getItemAtPosition(position)+" is selected", Toast.LENGTH_LONG).show(); 
        try { 
         MainActivity.AddSubscription(String.valueOf(parent.getItemAtPosition(position))); 
        } catch (TimeoutException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
    ); 

Но в настоящее время я не могу ссылаться на addSubscription который нестатическая

MainActivity.AddSubscription(String.valueOf(parent.getItemAtPosition(position))); 

Мне нужно создать не статический слушатель, который может вызывать addsubscription, возможно с ListView ? Если нет, я могу использовать другой тип представления?

+1

удалить MainActivity. , вызовите непосредственно метод AddSubscription (...) –

+0

Это находится в фрагменте – Jon

ответ

0

Просто, если ваш фрагмент помещается в MainActivity сделать это:

((MainActivity)getActivity()).AddSubscription(String.valueOf(parent.getItemAtPosition(position))); 
+1

Не работает, во-первых, метод добавления подписки находится внутри mainactivity, во-вторых, он дал мне ошибку: «MainActivity не является закрывающим классом» – Jon

+0

Этот список в фрагменте – Jon

+0

О, если во фрагменте вы пытались вызвать 'getActivity()'? – Ekalips

0

я бы не использовать getActivity() и брось, как этот подход, кажется хрупкой мне.

Я набрал это из головы без IDE, чтобы могли быть опечатки. Пусть Activity реализовать интерфейс SubscriptionHandler

public interface SubscriptionHandler { 
    public void addSubscription(String identifier); 
} 

Actitiy

public MainActivity extends AppCompatActivity implements SubscriptionHandler { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_id); 
     fragment.setSubscriptionHandler(this); 
    } 

    @Override 
    public void addSubscription(String identifier){ 
    //logic 
    } 

} 

, а затем использовать это в Фрагменте

public class MyFragment extends Fragment { 

    @Nullable private SubscriptionHandler subscriptionHandler; 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     ArrayAdapter<String> arrayAdapter; 
     arrayAdapter = new ArrayAdapter<String>(this.getContext(), android.R.layout.simple_list_item_1, categories); 

     ListView lv = (ListView) this.getActivity().findViewById(R.id.listProduct); 
     lv.setAdapter(arrayAdapter); 

     lv.setOnItemClickListener(
      new AdapterView.OnItemClickListener(){ 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        String type = String.valueOf(parent.getItemAtPosition(position)); 
        Toast.makeText(getContext(), parent.getItemAtPosition(position)+" is selected", Toast.LENGTH_LONG).show(); 
        try { 
         if(subscriptionManager != null) { 
          subscriptionHandler.addSubscription(String.valueOf(parent.getItemAtPosition(position))); 
         } 
        } catch (TimeoutException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
    ); 

    public void setSubscriptionHandler (SubscriptionHandler subscriptionHandler) { 
     this.subscriptionHandler = subscriptionHandler; 
    } 
} 
+0

Хорошо, спасибо, знаете ли вы, как извлечь фрагмент? instanciating thehandmanager и вызов findfragmentbyId только, кажется, возвращает объект фрагмента типа, мне нужно, чтобы он был того же типа класса, что и мой. – Jon

+0

Использование FragmentManager - это правильный подход, вам просто нужно отображать его так же, как с кнопками и всеми другими видами. Обязательно используйте правый FragmentManager. Я отредактировал ответ – Altoyyr

+0

Кажется, что этот подход возвращает null, я надеюсь, что добавил тег id xml в нужное место android: id = "@ + id/listFragment", это находится под рамкой – Jon

0

Выполните следующие действия в слушателем:

YourFragmentName.this.((MainActivity)getActivity()).AddSubscription(String.valueOf(parent.getItemAtPosition(position))); 
Смежные вопросы