Передача данных из операции обратно в адаптер recyclerview - PullRequest
0 голосов
/ 08 мая 2018

Как я могу передать данные из Activity обратно в адаптер RecyclerView. Я щелкнул один из рядов в представлении переработчика и начал новое действие. Из нового действия, как я могу передать объект обратно адаптеру и обновить строку, с которой я начал действие

    public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MyViewHolder> {

    private List<Movie> moviesList;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView title, year, genre;
        LinearLayout layout;

        public MyViewHolder(View view) {
            super(view);
            title = (TextView) view.findViewById(R.id.title);
            genre = (TextView) view.findViewById(R.id.genre);
            year = (TextView) view.findViewById(R.id.year);
            layout = (LinearLayout) view.findViewById(R.id.layout);
        }
    }

    public MoviesAdapter(List<Movie> moviesList) {
        this.moviesList = moviesList;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.movie_list_row, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Movie movie = moviesList.get(position);
        holder.title.setText(movie.getTitle());
        holder.genre.setText(movie.getGenre());
        holder.year.setText(movie.getYear());
        holder.layout.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        mContext.startActivity(new Intent(mContext, MovieDetailsActivity.class));   
                    }
                });
    }

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

Из новой созданной мной деятельности я отредактирую детали фильма и после нажатия кнопки ОК мне нужно передать объект Movie обратно в адаптер и обновить соответствующую строку.

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Создайте boolean в названии вашей модели, это isSelected, после нажатия на этот объект сделайте его true, а в onBindView методе RecyclerView проверьте, является ли объект isSelected истинным, затем выполнитевыбранное действие, которое вы хотите отобразить.

@Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Movie movie = moviesList.get(position);
        holder.title.setText(movie.getTitle());
        holder.genre.setText(movie.getGenre());
        holder.year.setText(movie.getYear());
        if(movie.isSelected()){
        holder.layout.setBackgroundColor(Color.GRAY);
        }
        holder.layout.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        movie.setSelected(true);
                        notifyDatasetChanged();
                        mContext.startActivity(new Intent(mContext, MovieDetailsActivity.class));   
                    }
                });
    }
0 голосов
/ 08 мая 2018

объявляет вашу активность адаптера singleTask в манифесте, а затем, когда вы открываете новое действие из адаптера по щелчку элемента, передаете позицию int элемента во втором действии, затем во втором действии вызываете первое действие с помощью намерения, подобного этому:

 public void callFirst()
{
Intent intent =new Intent(this, FirstAdatperActivity.classs);
// pass position which we was bring from first activity...
intent.putExtra("position", position);
startActivity(intent);
finish();
}

тогда вы получите результат в методе onNewIntent (), который вы можете переопределить в своем первом действии и получить намеренную позицию данных и обновить адаптер

recentAdapter.notifyItemChanged(postion, object);

другим способом вы можете вызвать второе действие, используя это:

Intent intent =new Intent(this, SecondActvity.class);
intent,putExtra("pos",postion);
startActivityForResult(intent, 101);

и от второго занятия

Intent intent =new Intent(this, SecondActvity.class);
intent,putExtra("pos",postion);
setresult(101);

тогда вы получите ответ в onActivityResult с положением в данных пакета намерений, так что вы можете обновить свой адаптер оттуда.

0 голосов
/ 08 мая 2018

Да, это возможно, прежде всего вам нужно реализовать метод для добавления элемента в ваш адаптер, скажем, void addItem(Movie movie);

Затем вам необходимо вернуть данные из предыдущего занятия.

Там у вас есть несколько решений. Самый очевидный из приведенных вами кодов - сделать ваш Movie класс Parcelable. Когда ваш фильм будет расширен до Parcelable, я просто дам вам эту ссылку, так как я не лучший человек, чтобы объяснить вам Parcelables: /) вы сможете связать его с вашим activity.

Итак, у вас есть ваш адаптер в первом упражнении (мы назовем его MainActivity), и вы хотите добавить Movie из второго занятия (назовем его SecondActivity) Что вам нужно сделать, это открыть свой SecondActivity «для результата», что означает, что вы ожидаете результата от этого действия.

Как только вы введете в SecondActivity любую логику, вам понадобится новый Movie для добавления и возврата его в MainActivity, добавив его в ваш результат.

Вот ссылка о действиях и результатах

Ваш окончательный код будет выглядеть примерно так

MainActivity

public static String MOVIE_REQUEST = "movie_request";
@Override
protected void onCreate(Bundle savedInstance){
     ...
        previous logic
     ...

     recyclerView.setAdapter(mAdapter);

     ...
        rest of the logic of your activity
     ...
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == MOVIE_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            Movie movie = (Movie)data.getParcelableExtra(SecondActivity.MOVIE_EXTRA);
            mAdapter.addItem(movie);
        }
    }
}

Адаптер

public void addItem(Movie movie){
    movieList.add(movie);
    //Your code should be way better than this anwser btw) notifyDatasetChanged isn't the best way to proceed
    notifyDatasetChanged();
}

SecondActivity

public static final String MOVIE_EXTRA = "movie_extra";
private void sendMovie(Movie movie){
    Intent data = new Intent();
    data.putExtra(MOVIE_EXTRA, movie);
    //At this point you're returning your result to your first activity
    setResult(RESULT_OK, data);
}

И все готово, вы должны были получить новый фильм со второго занятия

С уважением, Матье

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...