2016-09-21 13 views
0

したがって、cardAdapterを使用するフラグメントがあります。カードをクリックすると、アクティビティであるCarona(ride)というオブジェクトの詳細が表示されます。私はこの詳細アクティビティで提案をキャンセルするオプションを持っています。もしこれを行うと、前のフラグメントに戻りますが、カード(私のリサイクラービュー)は更新されません。アクティビティの終了後にフラグメントの通知/更新 - Android

これはこれまで私が試したことです。

私の「最初の」断片、すべてのカード。私はonActivityResultのメソッドが呼び出されることはないと思います。なぜなら私はそこにトーストを入れようとしたので、それは現れませんでした。

public class ProposalsFragment extends Fragment { 


private CaroneirosController cc; 
private RecyclerView myRecView; 
private CardProposalAdapter adapter; 
private int MYACTIVITY_REQUEST_CODE = 101; 


public ProposalsFragment() { 
    // Required empty public constructor 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View myView; 
    myView = inflater.inflate(R.layout.proposals_layout, container, false); 


    cc = CaroneirosController.getInstance(); 

    myRecView = (RecyclerView) myView.findViewById(R.id.propostasRecycler); 
    myRecView.setHasFixedSize(true); 
    LinearLayoutManager layoutManager = new LinearLayoutManager(this.getContext()); 
    myRecView.setLayoutManager(layoutManager); 
    myRecView.setItemAnimator(new DefaultItemAnimator()); 
    showData(); 

    return myView; 
} 

private void showData() { 
    List<Carona> c = cc.caronasOfferedBy(cc.getSessionUser()); 

    if(c.size() == 0){ 
     Toast.makeText(getContext(), "Você não tem caronas ofertadas.", Toast.LENGTH_LONG); 
    } else { 
     adapter = new CardProposalAdapter(c); 
     myRecView.setAdapter(adapter); 
    } 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if ((requestCode == 10001) && (resultCode == Activity.RESULT_OK)){ 
     Toast.makeText(getContext(), "Voltou", Toast.LENGTH_SHORT); 
     adapter.notifyDataSetChanged(); 
     getFragmentManager().beginTransaction().detach(this).attach(new ProposalsFragment()).commit(); 
    } 
} 

}

アダプタ

public class CardProposalAdapter extends RecyclerView.Adapter<CardProposalAdapter.ViewHolder> { 

List<Carona> caronas; 
Context mContext; 

public CardProposalAdapter(List<Carona> caronas){ 
    this.caronas = caronas; 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.cards_proposal, parent, false); 
    mContext = parent.getContext(); 
    ViewHolder viewHolder = new ViewHolder(v); 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    Carona c = caronas.get(position); 
    holder.tempCarona = c; 
    holder.localSaida.setText(c.getLocalSaida()); 
    holder.localDestino.setText(c.getDestino()); 
    holder.dataSaida.setText(c.getDataSaida().toString()); 
    holder.horaSaida.setText(c.getHoraSaida().toString()); 
    holder.vagas.setText(Integer.toString(c.getVagas())); 
    holder.ajudaDeCusto.setText(Double.toString(c.getAjudaDeCusto())); 
} 

@Override 
public int getItemCount() { 
    return caronas.size(); 
} 

class ViewHolder extends RecyclerView.ViewHolder{ 

    public View view; 
    private CaroneirosController cc; 

    public Carona tempCarona; 
    public TextView localSaida; 
    public TextView localDestino; 
    public TextView dataSaida; 
    public TextView horaSaida; 
    public TextView vagas; 
    public TextView ajudaDeCusto; 

    public ViewHolder(final View myView) { 
     super(myView); 
     cc = CaroneirosController.getInstance(); 

     localSaida = (TextView) myView.findViewById(R.id.local_saida_card); 
     localDestino = (TextView) myView.findViewById(R.id.local_destino_card); 
     dataSaida = (TextView) myView.findViewById(R.id.data_saida_card); 
     horaSaida = (TextView) myView.findViewById(R.id.horario_card); 
     vagas = (TextView) myView.findViewById(R.id.vagas_card); 
     ajudaDeCusto = (TextView) myView.findViewById(R.id.custo_card); 

     Button cancelarPropBtn = (Button) myView.findViewById(R.id.cancelarPropostaBtn); 

     cancelarPropBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       cc.cancelProposal(tempCarona); 
       caronas.remove(tempCarona); 
       notifyDataSetChanged(); 
      } 
     }); 

     myView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(v.getContext(), ProposalDetailsActivity.class); 
       intent.putExtra("propostaID", tempCarona.getId()); 
       ((Activity) mContext).startActivityForResult(intent, 10001); 
      } 
     }); 

    } 

} 

}

データセットを変更するアクティビティ。

public class ProposalDetailsActivity extends AppCompatActivity { 
CaroneirosController cc; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    cc = CaroneirosController.getInstance(); 

    setContentView(R.layout.activity_proposal_details); 

    Intent intent = getIntent(); 
    final Carona propostaCarona = cc.getCaronaByID(intent.getLongExtra("propostaID", 000)); 

    TextView saida = (TextView) findViewById(R.id.propostaSaida); 
    TextView destino = (TextView) findViewById(R.id.propostaDestino); 
    TextView data = (TextView) findViewById(R.id.propostaData); 
    TextView hora = (TextView) findViewById(R.id.propostaHora); 
    TextView vaga = (TextView) findViewById(R.id.propostaVaga); 
    TextView custo = (TextView) findViewById(R.id.propostaCusto); 

    saida.setText(propostaCarona.getLocalSaida()); 
    destino.setText(propostaCarona.getDestino()); 
    data.setText(propostaCarona.getDataSaida().toString()); 
    hora.setText(propostaCarona.getHoraSaida()); 
    vaga.setText(Integer.toString(propostaCarona.getVagas())); 
    custo.setText(Double.toString(propostaCarona.getAjudaDeCusto())); 

    final CardProposalAdapter ad = new CardProposalAdapter(cc.caronasOfferedBy(cc.getSessionUser())); 

    Button cancelarPropBtn = (Button) findViewById(R.id.cancelarPropostaBtn); 

    cancelarPropBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      cc.cancelProposal(propostaCarona); 
      setResult(RESULT_OK); 
      setResult(Activity.RESULT_OK); 
      finish(); 
     } 
    }); 

} 

}

私はここで、スタック上の多くの場所で検索しましたが、何も私のために働いていません。

+0

単純にOnActivityResultを使用するか、シングルトンを使用して参照するアクティビティを呼び出して更新してください –

+0

私はすでにOnActivityResult(フラグメントクラス)を使用しています –

+0

onActivityResultがコールバックされていますか? –

答えて

0

mainActivityでonActivityResultを上書きしましたか?はいの場合は、そのメソッドでsuper.onActivityResultにコールして、フラグメント内のコールを取得してください。

startActivityForResult()でフラグメントのcontext.startActivityForResult()を変更してください。

+0

問題は、アダプタ(viewHolder)からアクティビティを呼び出すため、startActivityForResult()を使用できません。 –

+0

これは別の質問です。このhttp://stackoverflow.com/questions/15444375/how-to-create-interface-between-fragment-and-adapterへの回答を確認してください。これに対処する多くの方法があります。 – masp

関連する問題