Android 将数据从活动传递回recyclerview适配器
如何将活动中的数据传递回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
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)
?因为它是一个私有方法,所以只能在同一个类中使用。但是我们必须在哪里使用它呢?提前谢谢你!