问题
How to pass data from recyclerview adapter to fragment and what i have to write the code in fragment to receive data.I have already check the links in this website but unfortunately unable to get correct code. Below is the code
ExampleAdapter.Java
public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
private ArrayList<ExampleItem> mExampleList;
@NonNull
@Override
public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v=LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.example_item,viewGroup,false);
ExampleViewHolder evh=new ExampleViewHolder(v);
return evh;
}
@Override
public void onBindViewHolder(@NonNull ExampleViewHolder exampleViewHolder, int i) {
final ExampleItem currentItem=mExampleList.get(i);
exampleViewHolder.mTextView.setText(currentItem.getmText());
exampleViewHolder.mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// pass the data to the fragment
}
});
}
@Override
public int getItemCount() {
return mExampleList.size();
}
public static class ExampleViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public ExampleViewHolder(@NonNull View itemView) {
super(itemView);
mTextView=itemView.findViewById(R.id.texttitle);
}
}
public ExampleAdapter(ArrayList<ExampleItem> exampleList){
this.mExampleList=exampleList;
}
}
回答1:
You can pass data by attaching a callback into your adapter:
Create an interface:
interface OnTextClickListener {
void onTextClick(ExampleItem data);
}
Delegate the callback:
class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
List<ExampleItem> items;
OnTextClickListener listener;
ExampleAdapter(List<ExampleItem> items, OnTextClickListener listener) {
this.items = items;
this.listener = listener;
}
@Override
public void onBindViewHolder(ExampleViewHolder viewHolder, int position) {
viewHolder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Say you want to pass an ExampleItem back to the fragment...
ExampleItem data = items.get(position);
listener.onTextClick(data);
}
});
}
}
Implement the fragment with the interface:
class YourFragment extends Fragment implements OnTextClickListener {
public onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
recyclerView.setAdapter(new ExampleAdapter(this));
}
void onTextClick(ExampleItem data) {
// Now you can do however you want with the data here...
Toast.makeText(getActivity(), "Got: " + data, Toast.LENGTH_SHORT).show()
}
}
回答2:
You have two options;
Using SharedPreferences
:
Context myContext = exampleViewHolder.itemView.getContext()
SharedPreferences.Editor editor = getSharedPreferences("DeviceToken", MODE_PRIVATE).edit();
editor.putString("YourKeyNameHere", currentItem.getmText()); // or add toString() after if needed
editor.apply();
To get:
SharedPreferences prefs = getSharedPreferences("DeviceToken", MODE_PRIVATE);
String deviceToken = prefs.getString("YourKeyNameHere", null); // get it here
Using Intent
: (If you want to start the another Activity
when you pass the data)
Intent intent = new Intent(myContext , SignoutActivity.class);
intent.putExtra("EXTRA_TEXT", currentItem.getmText());
startActivity(intent); // if needed, add myContext before starting myContext.startActivity...
To get:
String extraText = getIntent().getStringExtra("EXTRA_TEXT");
回答3:
You have "ClickListener" in fragment.
for example.
@Override
public void onResume(){
super.onResume();
((ExampleAdapter) mAdapter).onItemClick(new RecyclerViewItemClick() {
@Override
public void onItemClick(int position, View v) {
//to do. ArrayList<> data.get(position).getYourItem();
}
});
}
And you must create interface RecyclerViewItemClick.java
public interface RecyclerViewItemClick {
public void onItemClick(int position, View v);
}
Last. ExampleAdapter.java add
public void onItemClick(RecyclerViewItemClick mclick){
this.myClickListener = mclick;
}
ExampleViewHolder method add in
@Override
public void onClick(View v) {
myClickListener.onItemClick(getAdapterPosition(), v);
notifyDataSetChanged();
}
I hope you solve this problem. Thank.
回答4:
Have a IDataCollector
interface. Implement her in the Fragment
, pass the Fragment
reference as a constructor parameter, and use it inside the adapter
public interface IDataCollector {
void setText(String text);
void setAnything(Object anything);
}
// Fragment
public class Fragment implements IDataCollector {
private void initView() {
// Add this as a parameter
ExampleAdapter adapter = new ExampleAdapter(... , this);
}
@Override
public void setText(String text){
this.textField = text;
}
@Override
public void setText(Object anything){
this.anything = anything;
}
}
// Adapter code
// Constructor, parameters ommited
public ExampleAdapter(...., IDataCollector dataCollector) {
this.dataCollector = dataCollector;
}
@Override
public void onBindViewHolder(@NonNull ExampleViewHolder exampleViewHolder, int i) {
final ExampleItem currentItem=mExampleList.get(i);
exampleViewHolder.mTextView.setText(currentItem.getmText());
exampleViewHolder.mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dataCollector.setText(((TextView)v.findViewById(R.id.label1)).getText());
....
}
});
}
回答5:
Through Interface you can solve this 1. create an Interface in adapter , add required methods 2. call those methods in adapter wherever required 3. implement the interface in fragment or activity, pass a context to the adapter
来源:https://stackoverflow.com/questions/52829707/how-to-pass-or-send-data-from-recyclerview-adapter-to-fragment