将活动中的数据传递回Recyclerview适配器

时间:2018-05-08 11:58:51

标签: android android-recyclerview recycler-adapter

如何将活动中的数据传递回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 :(得分:0)

是的,首先你需要实现一个方法来在你的适配器中添加一个元素,让我们说void addItem(Movie movie);

然后,您需要从之前的活动中恢复数据。

你有多种解决方案。最明显的一个,鉴于您向我们展示的代码将是MovieParcelable。当您的电影延长至Parcelable时,我只会给您this链接,因为我不是向您解释Parcelables的最佳人选:/)您可以将它捆绑到您的{ {1}}。

所以,你在第一个活动中有你的适配器(我们称之为activity),你想要从你的第二个活动中添加MainActivity(我们称之为Movie) 您需要做的是打开SecondActivity“获得结果”,这意味着您期望此活动产生结果。

一旦进入SecondActivity,您需要做一些新的SecondActivity添加新的Movie并将其添加到您的MainActivity并将其放入您的结果中。

以下是关于activities and results

的链接

您的最终代码将如下所示

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

你已经完成了,你应该从第二个活动中获得一部新电影

此致 马修

答案 1 :(得分:0)

在您的模型名称boolean中创建isSelected,点击该对象后trueonBindView方法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)); } }); } 是否为真,然后根据需要执行选定的操作。

com.fasterxml.jackson.core.JsonToken

答案 2 :(得分:0)

在清单中声明适配器活动singleTask,然后在单击item时从适配器打开新活动,在第二个活动中传递item的int位置,然后在第二个activity中使用intent调用第一个activity,如下所示:

 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中得到意图束数据中的位置响应,因此你可以从那里刷新你的适配器。