Как передать или отправить данные из адаптера утилитного просмотра во фрагмент - PullRequest
0 голосов
/ 16 октября 2018

Как передать данные из адаптера recyclerview во фрагмент и что мне нужно написать код во фрагменте для получения данных. Я уже проверил ссылки на этом сайте, но, к сожалению, не смог получить правильный код.Ниже приведен код

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;
}
}

Ответы [ 5 ]

0 голосов
/ 16 октября 2018

С помощью интерфейса вы можете решить эту проблему: 1. создать интерфейс в адаптере, добавить необходимые методы 2. вызывать эти методы в адаптере, где это необходимо 3. реализовать интерфейс во фрагменте или в действии, передать контекст адаптеру

0 голосов
/ 16 октября 2018

Вы можете передавать данные, подключив обратный вызов к адаптеру:

Создать интерфейс :

interface OnTextClickListener {
    void onTextClick(ExampleItem data);
}

Делегировать обратный вызов :

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);
            }
        });
    }
}

Реализация фрагмента с интерфейсом :

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()
    }
}
0 голосов
/ 16 октября 2018

У вас есть "ClickListener" во фрагменте.

например.

@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();
        }
    });
}

И вы должны создать интерфейс 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 метод add in

@Override
public void onClick(View v) {
    myClickListener.onItemClick(getAdapterPosition(), v);
    notifyDataSetChanged();
}

Надеюсь, вы решите эту проблему.Спасибо.

0 голосов
/ 16 октября 2018

Имеет интерфейс IDataCollector.Реализуйте ее в Fragment, передайте ссылку Fragment в качестве параметра конструктора и используйте ее внутри адаптера

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());
            ....
        }
    });
}
0 голосов
/ 16 октября 2018

У вас есть два варианта:

Использование 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();

Чтобы получить:

SharedPreferences prefs = getSharedPreferences("DeviceToken", MODE_PRIVATE);
String deviceToken = prefs.getString("YourKeyNameHere", null); // get it here

Использование Intent: (Если вы хотите запустить другую Activity при передаче данных)

Intent intent = new Intent(myContext , SignoutActivity.class);
intent.putExtra("EXTRA_TEXT", currentItem.getmText());
startActivity(intent); // if needed, add myContext before starting myContext.startActivity...

Чтобы получить:

String extraText = getIntent().getStringExtra("EXTRA_TEXT");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...