Android 将数据从活动传递回recyclerview适配器

Android 将数据从活动传递回recyclerview适配器,android,android-recyclerview,Android,Android Recyclerview,如何将活动中的数据传递回RecyclerView适配器。我已单击“回收器”视图中的一行,并开始了一项新活动。从新活动中,我如何将对象传递回适配器并更新启动活动的行 public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MyViewHolder> { private List<Movie> moviesList; public class MyViewHolde

如何将活动中的数据传递回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();
    }
}
公共类MoviesAdapter扩展了RecyclerView.Adapter{ 私人名单电影名单; 公共类MyViewHolder扩展了RecyclerView.ViewHolder{ 公共文本视图标题、年份、类型; 线性布局; 公共MyViewHolder(视图){ 超级(视图); title=(TextView)view.findViewById(R.id.title); genre=(TextView)view.findViewById(R.id.genre); 年份=(TextView)view.findViewById(R.id.year); layout=(LinearLayout)view.findViewById(R.id.layout); } } 公共MoviesAdapter(列表moviesList){ this.moviesList=moviesList; } @凌驾 公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){ View itemView=LayoutInflater.from(parent.getContext()) .充气(R.layout.movie\u list\u行,父项,false); 返回新的MyViewHolder(itemView); } @凌驾 公共无效onBindViewHolder(MyViewHolder,int位置){ Movie Movie=moviesList.get(位置); holder.title.setText(movie.getTitle()); holder.genre.setText(movie.getGenre()); holder.year.setText(movie.getYear()); holder.layout.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ startActivity(新意图(mContext、MovieDetailsActivity.class)); } }); } @凌驾 public int getItemCount(){ 返回moviesList.size(); } }
从我创建的新活动中,我将编辑电影详细信息,单击“确定”后,我需要将电影对象传递回适配器并更新相应的行。

是的,这是可能的,首先您需要实现一种方法来在适配器中添加元素,比如说
void addItem(电影电影)

然后,您需要从以前的活动中获取数据

这里有多种解决方案。考虑到您向我们展示的代码,最明显的一点是使您的
电影
可打包
。当您的电影扩展到
包裹时
我会给您链接,因为我不是向您解释包裹的最佳人选:/)您可以将其绑定到您的
活动

因此,您的第一个活动(我们称之为
main活动
)中有适配器,并且您希望从第二个活动(我们称之为
SecondActivity
)中添加一部
电影
) 您需要做的是打开您的
SecondActivity
“for result”,这意味着您期望此活动产生结果

一旦进入
第二个活动
中,请执行任何需要的逻辑来制作一部新的
电影
,将其添加并返回到
main活动
,方法是将其放入结果中

这里有一个关于

您的最终代码将如下所示

主要活动

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();
}
第二项活动

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);
}
完成后,你应该从第二次活动中获得一部新电影

问候,,
Matthieu

在您的型号名称中创建一个
布尔值
,单击该对象后,使其
为true
,并在
回收视图的
方法中检查对象
为selected
是否为true,然后执行您想要显示的选定操作

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

在清单中声明适配器活动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中获得响应,并在意向包数据中显示位置,因此您可以从那里校准刷新适配器。

嘿,伙计,分享你的代码,澄清你关于你想要实现什么的问题,比如你想如何更新行……我认为这个问题已经清楚地解释了@TRIENTRANyou将对象传递给db而不是适配器,你如何编辑该对象?只需将其放在EditText中,看看@D处的公认答案。我不想保存。我需要从Movie对象获取,然后更新行。您好,我刚刚找到了这个答案,我想这就是我几天来一直在寻找的:)我唯一不太明白的是,我们如何使用方法
public void sendMovie(Movie Movie)
?因为它是一个私有方法,所以只能在同一个类中使用。但是我们必须在哪里使用它呢?提前谢谢你!