2017-01-12 1 views
2

In meiner App habe ich eine Fragment, die eine Liste von Elementen darstellt.Schaltflächenfunktion in Fragment, das eine Liste darstellt

Dies geschieht mit einem RecyclerViewAdapter. Ich habe eine OnListFragmentInteractionListener implementiert und daher, wenn ich auf ein Element in der Liste klicke, macht meine App etwas.

Das funktioniert richtig. Ich entschied jedoch, dass ich auch einen Knopf innerhalb dieses Artikels hinzufügen möchte. Wenn ich also auf eine andere Stelle als die Schaltfläche klicke, aber innerhalb der Grenzen des Objekts, wird die Funktionalität wie zuvor fortgesetzt, aber wenn ich auf die Schaltfläche klicke, wird etwas anderes gemacht.

Meine Frage ist, wo ich diese Funktionalität implementieren?

Die XML-Datei, die ein Element in der Liste darstellt, ist nur ein paar Textansichten und eine FloatingActionButton.

Ich dachte, ich muss dies in meinem Adapter implementieren, aber wo genau? Mein Adapter sieht wie folgt aus:

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

    private final List<Contract> mValues; 
    private final OnListFragmentInteractionListener mListener; 

    public ContractRecyclerViewAdapter(List<Contract> items, OnListFragmentInteractionListener listener) { 
     mValues = items; 
     mListener = listener; 
    } 

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

    @Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 
     holder.mItem = mValues.get(position); 
     holder.mSell.setText(mValues.get(position).getSell()); 
     if (holder.mDescription != null) { 
      holder.mDescription.setText(mValues.get(position).getDescription()); 
     } 

     // TODO: Get the price from parameters? 
     holder.mPrice.setText(((Double) new Random().nextDouble()).toString()); 

     holder.mView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (null != mListener) { 
        // Notify the active callbacks interface (the activity, if the 
        // fragment is attached to one) that an item has been selected. 
        mListener.onListFragmentInteraction(holder.mItem); 
       } 
      } 
     }); 

     holder.mBtn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

      } 
     }); 
    } 

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

    public void addContract(Contract contract) { 
     mValues.add(contract); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     public final View mView; 
     public final TextView mSell; 
     public final TextView mDescription; 
     public final TextView mPrice; 
     public final FloatingActionButton mBtn; 
     public Contract mItem; 

     public ViewHolder(View view) { 
      super(view); 
      mView = view; 
      mSell = (TextView) view.findViewById(R.id.company_text); 
      mDescription = (TextView) view.findViewById(R.id.contract_description); 
      mPrice = (TextView) view.findViewById(R.id.price_text); 
      mBtn = (FloatingActionButton) view.findViewById(R.id.buy_button_from_list); 
     } 

     @Override 
     public String toString() { 
      return super.toString() + " '" + mSell.getText() + ", " + 
        mDescription.getText() + "'"; 
     } 
    } 
} 

Das Problem, das ist da, wo ich die onClickListener für meine FloatingActionButton implementieren werde ich Zugriff auf meine SharedPreferences haben müssen, so dass ich denke, ich werde es in einer Activity Klasse implementieren müssen (oder Fragment Klasse). Ist das wahr? Wenn ich diesen Weg gehe, dann muss ich es in der Fragment implementieren, deren Inhalt diese Ansicht ist, aber wie weiß ich dann die Position des ausgewählten Elements?

Danke.

Antwort

1

Sie können eine andere Methode in Ihrem interface erstellen,

private interface OnListFragmentInteractionListener { 

    void onListFragmentInteraction(Contract mItem); 

    void onButtonClicked(Contract mItem); // You may want to edit the arguments of the method 

} 

die onButtonClicked in Ihrer Tätigkeit umsetzen und tun es Ihre Sachen.

Rufen Sie die Methode in Ihrem onClick des Button wie folgt

holder.mBtn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     if (null != mListener) { 
      mListener.onButtonClicked(holder.mItem); 
     } 
    } 
}); 
0

wie werde ich die Position des Elements kennen ausgewählt?

Um die Position des Einzelteil zu erhalten ausgewählte Sie die getAdapterPosition() Methode der RecyclerView.ViewHolder ‚s-Klasse in Ihrem View.OnClickListener nutzen können.

holder.btnXyz.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      int position = holder.getAdapterPosition(); 
      Model item = items.get(position); 
      /** your code **/ 
     } 
    }); 
Verwandte Themen