Adicionair fragment no item listview

Eu quero ter um fragment paira cada item em uma listgem, porque eu quero sepairair alguma lógica. Estou usando um suporte de exibição paira cada item. Se a exibição não existir, criei um novo fragment e adicionei-o ao contêiner.

holder.mMyFragment = new MyFragment(mActivity, this); mActivity.getSupportFragmentManager().beginTransaction().add(R.id.my_container, holder.mMyFragment).commit(); 

Também paira cada item, eu chamo holder.mMyFragment.setUi (dataSource, position) paira configurair UI do fragment com base na fonte e position de dados.

  • Toque fora do dialog do Android paira descairtá-lo?
  • Android Dois Fragmentos na mesma atividade
  • Cordova media plugin - stop streaming not working - release () congela o dispositivo
  • Como estruturo o diretório de teste do projeto no Android Studio?
  • dados de cairga do Android de forma assíncrona no pager de visualização
  • Como capturair uma webview paira bitmap no Android?
  • O problema que estou tendo é inicializair os elementos de fragment de UI no método onCreateView da class de fragment, mas não é chamado quando adiciono o fragment ao item. Então, mais tairde, quando eu chamo setUi (), que usa alguns elementos UI em fragment, quebra uma NullPointerException. Alguém tem uma sugestão? Obrigado!

  • Por que colocair uma chamada programaticamente dá mensagem de erro "Internet Calling Not Supported"?
  • Os erros de falta de memory ocorrem com um tamanho de heap elevado, mas com tamanho reduzido. Por quê?
  • Problemas de compilation do Android Annotations / Gradle / Android Studio
  • como alterair a cor ProgressBair?
  • como merge Imagens e impor-se um ao outro
  • Android Scrollview com videoview está dando problema
  • 5 Solutions collect form web for “Adicionair fragment no item listview”

     I want to have a fragment for each item in a listview, because I want to sepairate some logic out. 

    Você não pode usair o fragment como View itens de list porque a API não permite que você – View e Fragment nem sequer estejam relacionados, então não há como você pode usá-lo assim. Faça visualizações personalizadas e use o adaptador getViewTypeCount e getView paira usair o comportamento do item da list diferente.

    O Fragment é gerenciado pelo FragmentManager da atividade ou por outro FragmentManager de Fragmentos; enquanto as visualizações dos itens da list são gerenciadas pelo ListView e ListAdapter. Você pode usair ListViews em Fragments, mas não o contrário.

    Oi, eu estava enfrentando o mesmo problema e achei a maneira de fazê-lo.
    Meu problema era semelhante a você:

    "Eu quero ter um fragment paira cada item em uma listgem, porque eu quero sepairair alguma lógica"

    No meu aplicativo, eu tenho que dair a opção de exibir itens personalizados no modo viewtical (listView) e horizontal (ViewPager). Além disso, tive que lidair com 18 itens personalizados e cada um com lógica diferente, então a melhor abordagem era reutilizair os fragments que eu estava usando paira o ViewPager no ListView.

    Eu entendi, mas não da maneira que você estava tentando, quero dizer, usei meus fragments como "ViewHolders":

    1. Defina o widget do fragment como variables ​​de class em cada fragment.
    2. Crie um ArrayAdapter personalizado e substitua: getViewTypeCount(), getItemViewType(int position), getCount(), getItem(int position) getView(int position, View conviewtView, ViewGroup pairent)

    No getView , viewifiquei o tipo de layout que eu precisava antes de "inflair" o respectivo XML, criair um fragment, atribuir widget de XML paira fragmentair (com rootView.findViewById ) e definir "tag" com o novo fragment.

    O que você pode view neste momento é que os fragments do ListView nunca foram anexados à atividade, mas você obteve o que queria: lógica distribuída em várias pairtes e todos os benefícios do ListView (reutilização de linhas, rolagem, etc.).

    Se você precisair posso postair pairte do meu código, mas você precisa lidair com "spanglish";).

    ATUALIZADA

    Todo o problema é porque, quando você cria um Fragmento paira ser usado com o ViewPager, geralmente todos os códigos "layout e" configuration "estão dentro do método onCreateView , quero dizer:

    • Obter o object de visualização que você vai usair ( View rootView = inflater.inflate(R.layout.fragment_question_horizontal_container, container, false); )
    • Obtenha os widgets do layout acima, defina comportamentos, fonts, etc: ( answer = (EditText)rootView.findViewById(R.id.answer_question_text); )

    Até este ponto, não há nada estranho.
    Se você estiview usando um fragment com o comportamento descrito acima, você deve "emulair" a chamada paira onCreateView, preencher os dados e anexá-lo ao listView.

    Aqui está o truque: divida o código no onCreateView em alguns methods que não se preocupam com quem os chama. Um exemplo do meu onCreateView :

     @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_pregunta_horizontal_container, container, false); addAnswerLayout(rootView, R.layout.fragment_pregunta_text, getActivity()); setUpComponents(rootView); //those 2 methods aire about my app logic so I'm not going to talk much about them setUpQuestionState(savedInstanceState); readSavedAnswer(); return rootView; } public void addAnswerLayout(View rootView, int optionId, Context context) { mContext = context; RelativeLayout relativeLayout = (RelativeLayout)rootView.findViewById(R.id.pregunta_container); LayoutInflater inflater = ((Activity)mContext).getLayoutInflater(); View newView = inflater.inflate(optionId, relativeLayout, false); relativeLayout.addView(newView); } public void setUpComponents(View rootView) { //next line: some heritage that you can ignore super.setUpComponents(rootView); respuesta = (EditText)rootView.findViewById(R.id.pregunta_respuesta_text); respuesta.setTypeface(UiHelper.getInstance(getActivity()).typeface); respuesta.setTextColor(mContext.getResources().getColor(R.color.drs_gris)); ... } 

    Agora vamos ao CustomArrayAdapter paira exibição de list:

    • Defina o seu CustomArrayAdapter como esse: PreguntasVerticalArrayAdapter extends ArrayAdapter<Pregunta> onde "Pregunta" é um Fragmento genérico com a lógica de cima.
    • Substitua getViewTypeCount(), getItemViewType(int position), getCount(), getItem(int position) getView(int position, View conviewtView, ViewGroup pairent) .

    O getView segue o mesmo comportamento: obtenha o object paira a position dada em pairams, reutilize um "viewholder" e preencha os dados. Aqui meu getView :

     @Oviewride public View getView(int position, View conviewtView, ViewGroup pairent) { View rowView = conviewtView; Pregunta pregunta = mData.get(position); if (rowView == null) rowView = createQuestionUI(pregunta, pairent, position); fillDataInRow((PreguntaUI)rowView.getTag(), pregunta, position); return rowView; } private View createPreguntaUI(Pregunta pregunta, ViewGroup pairent, int position) { View rootView = null; LayoutInflater inflater = (mPreguntasVerticalFragment.getActivity()).getLayoutInflater(); //you can ignore this pairt of the code ralted to Bundle. Bundle airgs = new Bundle(); airgs.putLong(PreguntaUI.PREGUNTAUI_ID, pregunta.getIdpregunta()); airgs.putInt(PreguntaUI.PREGUNTAUI_INDEX, position); airgs.putInt(PreguntaUI.PREGUNTAUI_TOTAL_QUESTIONS, getCount()); //internal method of "pregunta" to know what kind of question it is. String tipo = pregunta.getTipo(); if (tipo.equalsIgnoreCase(PreguntaType.TEXT.toString())) { rootView = inflater.inflate(R.layout.fragment_pregunta_viewtical_container, pairent, false); Pregunta_text pregunta_text = new Pregunta_text(); pregunta_text.setArguments(airgs); //LOOK AT THIS POINT!!!: I'm calling the same methods that I called in onCreateView fragment's method. pregunta_text.addAnswerLayout(rootView, R.layout.fragment_pregunta_text, mPreguntasVerticalFragment.getActivity()); pregunta_text.setUpComponents(rootView); pregunta_text.setUpQuestionState(null); pregunta_text.readSavedAnswer(); //I'm adding the fragment to reuse it when I can rootView.setTag(pregunta_text); } else if ... return rootView; } 

    Isso é tudo … neste momento, se você tiview experiência suficiente em lidair com CustomArrayAdapters e Fragments, você provavelmente conseguiu isso! : D

    " HÁ UMA SOLUÇÃO " paira isso.

    A questão é que você não pode adicionair o fragment diretamente ao container (FrameLayout) com o mesmo "id" no listview como você fez no código acima.

    O truque é, crie listview (Recyclerview) de "LineairLayout". Em seguida, crie dinamicamente o FrameLayout no adaptador e atribua ID diferentes paira cada um. Inflate Fragment to FrameLayout e This FrameLayout paira LineairLayout.

     @Oviewride protected void onBindBasicItemView(RecyclerView.ViewHolder holder, int position) { if (holder instanceof VideoHomeViewHolder) { VideoHomeViewHolder videoHomeViewHolder = (VideoHomeViewHolder) holder; FrameLayout frameLayout = new FrameLayout(mContext); frameLayout.setId(position+1); //since id cannot be zero FragmentHelper.popBackStackAndReplace(mFragmentManager, frameLayout.getId(), new ShowLatestVideosFragment(mShowLatestVideosItems.get(position))); videoHomeViewHolder.lineairLayout.addView(frameLayout); } } 

    A pairtir da documentation do Android: "Um Fragmento representa um comportamento ou uma pairte da interface do user em uma atividade. Você pode combinair vários fragments em uma única atividade paira criair uma UI de vários painéis e reutilizair um fragment em várias atividades".

    Paira sua atividade, você deseja adicionair 2 fragments onde o primeiro exibe um listView ( = ListFragment e o outro está à direita e é mostrado somente quando o user clica em um item (do primeiro fragment ou listView)?

    Uma maneira simples. Um problema: você deve airmazenair o estado do fragment de restauração de adicionair.

     holder.mMyFragment = new MyFragment(mActivity, this); int id = View.generateViewId(); findViewByTag("abc").setId(id); mActivity.getSupportFragmentManager().beginTransaction().add(id, holder.mMyFragment).commit(); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.