在创建 CardView 并将其放入 RecyclerView 后访问 CardView 中的项目
Accessing items in CardView after it has been created and put into a RecyclerView
我正在尝试弄清楚如何在创建 CardView
中的某个 ImageView
或 TextView
小部件并将其传递给主 RecyclerView 之后。
所以我的代码如下:
首先 class 包含项目 :
public class MovieDetails {
protected static String title;
protected static Bitmap imageViewPoster;
protected static Bitmap imageViewFanart;}
现在我有了 RecyclerView Adapter,它也像这样容纳 ViewHolder 内部 class :
public class MovieDetailsAdapter extends RecyclerView.Adapter<MovieDetailsAdapter.MovieViewHolder> {
private List<MovieDetails> movieList;
public MovieDetailsAdapter(List<MovieDetails> movietList) {
this.movieList = movietList;
}
@Override
public int getItemCount() {
return movieList.size();
}
@Override
public MovieViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.card_layout_movies, viewGroup, false);
return new MovieViewHolder(itemView);
}
@Override
public void onBindViewHolder(MovieViewHolder movieViewHolder, int i) {
MovieDetails md = movieList.get(i);
movieViewHolder.vTitle.setText(md.title);
movieViewHolder.vPoster.setImageBitmap(md.imageViewPoster);
movieViewHolder.vFanart.setImageBitmap(md.imageViewFanart);
}
public static class MovieViewHolder extends RecyclerView.ViewHolder {
protected TextView vTitle;
protected ImageView vPoster;
protected ImageView vFanart;
public MovieViewHolder(View v)
{
super(v);
vTitle = (TextView)v.findViewById(R.id.title);
vPoster = (ImageView) v.findViewById(R.id.imageViewPoster);
vFanart = (ImageView) v.findViewById(R.id.imageViewFanart);
}
}}
现在是我的主要 Activity class,我正在其中设置布局和视图并创建 MovieList 对象数组。
public class MoviesListActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_movies_list);
RecyclerView recList = (RecyclerView) findViewById(R.id.cardList);
recList.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
recList.setLayoutManager(llm);
MovieDetailsAdapter ca = new MovieDetailsAdapter(createList(5));
recList.setAdapter(ca);
}
private List<MovieDetails> createList(int size){
List<MovieDetails> moviedetailsList = new ArrayList<MovieDetails>();
for (int i=1; i <= size; i++) {
MovieDetails moviedetails = new MovieDetails();
moviedetails.title= "Name" +i;
Bitmap bit = resizeBitmap(getResources(), R.drawable.poster_example, 640, 955);
moviedetails.imageViewPoster = bit;
Bitmap bit2 = resizeBitmap(getResources(), R.drawable.fanart_example, 800, 450);
moviedetails.imageViewFanart = bit2;
moviedetailsList.add(moviedetails);
}
return moviedetailsList;
}
resizeBitmap 是我用来调整图像大小的另一个函数,与问题无关,我把它编辑掉了。
现在,我已经创建了这个 CardView 列表,有什么方法可以从主 Activity class 修改其中的 ImageView 和 TextView 吗?我想这样做,因为我正在使用 AsyncTask 检索我想要替换的新图像,所以我首先必须用一些 "default" 图像初始化位图,然后再根据 AsyncTask 的结果修改它们用于从服务器检索它们。
搜索了 google,找到了很多关于 CardViews 的教程,但没有关于此的内容,感谢任何帮助,谢谢。
这个CardView
无所谓。它就像一个LinearLayout
。它不需要任何不同于标准 RecyclerView
.
的处理
首先,您只需要拥有并修改一个 List<MovieDetails>
和一个 MovieDetailsAdapter
即可。 (如果你需要,你可以把你的工作放在临时的)。
因此,您应该在适配器的代码中创建列表 public static
。
然后在Activity,而不是
@Override
protected void onCreate(Bundle savedInstanceState) {
...
MovieDetailsAdapter ca = new MovieDetailsAdapter(createList(5));
...
}
做
private MovieDetailsAdapter ca;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
ca = new MovieDetailsAdapter(createList(5));
...
}
将 createList 的通用 MovieDetails(使用大小)移动到另一个方法(我将其称为 makeGenericMovieDetails()
)。 (在 createList 中,只需在 for 循环中替换它即可。)
private MovieDetails makeGenericMovieDetails() {
MovieDetails moviedetails = new MovieDetails();
// The size of the list, but add one.
moviedetails.title= "Name" + (adapter.getSize() + 1);
Bitmap bit = resizeBitmap(getResources(), R.drawable.poster_example, 640, 955);
moviedetails.imageViewPoster = bit;
Bitmap bit2 = resizeBitmap(getResources(), R.drawable.fanart_example, 800, 450);
moviedetails.imageViewFanart = bit2;
return moviedetails;
}
现在,如果您想更改它,请执行此操作(调整大小后):
private void setMovieDetails(@Nullable Bitmap poster, @Nullable Bitmap fanart, @Nullable String title, int id) {
MovieDetails details;
boolean isAlreadyThere = true;
try {
details = ca.movieList.get(id);
} catch (IndexOutOfBoundsException e) {
isAlreadyThere = false;
// If we come with a bad ID we crash. No fun.
details = makeGenericMovieDetails();
}
if (poster != null)
details.imageViewPoster = poster;
if (fanart != null)
details.imageViewFanart = fanart;
if (title != null)
details.Title = title;
ca.movieList.set(id, details);
if (isAlreadyThere) {
ca.notifyItemChanged(id);
} else {
ca.notifyItemInserted(id);
}
}
这里的重点是
ca.notifyItemChanged(id);
告诉适配器更新该项目。
我希望这能奏效,我正在从 StackExchange 的应用程序中执行此操作,但它一直在丢失草稿,所以请先进行测试。
现在,当您想要更改图片时,只需调用 setMovieDetails(poster, fanart, title, id);
并为您不想更改的值传递 null。 (除了 id)。
顺便说一句,尝试让变量以小写字母开头。因此,不要使用 Title
,而是使用 title
或 mTitle
。更好看,更容易区分。
我正在尝试弄清楚如何在创建 CardView
中的某个 ImageView
或 TextView
小部件并将其传递给主 RecyclerView 之后。
所以我的代码如下:
首先 class 包含项目 :
public class MovieDetails {
protected static String title;
protected static Bitmap imageViewPoster;
protected static Bitmap imageViewFanart;}
现在我有了 RecyclerView Adapter,它也像这样容纳 ViewHolder 内部 class :
public class MovieDetailsAdapter extends RecyclerView.Adapter<MovieDetailsAdapter.MovieViewHolder> {
private List<MovieDetails> movieList;
public MovieDetailsAdapter(List<MovieDetails> movietList) {
this.movieList = movietList;
}
@Override
public int getItemCount() {
return movieList.size();
}
@Override
public MovieViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.card_layout_movies, viewGroup, false);
return new MovieViewHolder(itemView);
}
@Override
public void onBindViewHolder(MovieViewHolder movieViewHolder, int i) {
MovieDetails md = movieList.get(i);
movieViewHolder.vTitle.setText(md.title);
movieViewHolder.vPoster.setImageBitmap(md.imageViewPoster);
movieViewHolder.vFanart.setImageBitmap(md.imageViewFanart);
}
public static class MovieViewHolder extends RecyclerView.ViewHolder {
protected TextView vTitle;
protected ImageView vPoster;
protected ImageView vFanart;
public MovieViewHolder(View v)
{
super(v);
vTitle = (TextView)v.findViewById(R.id.title);
vPoster = (ImageView) v.findViewById(R.id.imageViewPoster);
vFanart = (ImageView) v.findViewById(R.id.imageViewFanart);
}
}}
现在是我的主要 Activity class,我正在其中设置布局和视图并创建 MovieList 对象数组。
public class MoviesListActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_movies_list);
RecyclerView recList = (RecyclerView) findViewById(R.id.cardList);
recList.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(this);
llm.setOrientation(LinearLayoutManager.VERTICAL);
recList.setLayoutManager(llm);
MovieDetailsAdapter ca = new MovieDetailsAdapter(createList(5));
recList.setAdapter(ca);
}
private List<MovieDetails> createList(int size){
List<MovieDetails> moviedetailsList = new ArrayList<MovieDetails>();
for (int i=1; i <= size; i++) {
MovieDetails moviedetails = new MovieDetails();
moviedetails.title= "Name" +i;
Bitmap bit = resizeBitmap(getResources(), R.drawable.poster_example, 640, 955);
moviedetails.imageViewPoster = bit;
Bitmap bit2 = resizeBitmap(getResources(), R.drawable.fanart_example, 800, 450);
moviedetails.imageViewFanart = bit2;
moviedetailsList.add(moviedetails);
}
return moviedetailsList;
}
resizeBitmap 是我用来调整图像大小的另一个函数,与问题无关,我把它编辑掉了。
现在,我已经创建了这个 CardView 列表,有什么方法可以从主 Activity class 修改其中的 ImageView 和 TextView 吗?我想这样做,因为我正在使用 AsyncTask 检索我想要替换的新图像,所以我首先必须用一些 "default" 图像初始化位图,然后再根据 AsyncTask 的结果修改它们用于从服务器检索它们。
搜索了 google,找到了很多关于 CardViews 的教程,但没有关于此的内容,感谢任何帮助,谢谢。
这个CardView
无所谓。它就像一个LinearLayout
。它不需要任何不同于标准 RecyclerView
.
首先,您只需要拥有并修改一个 List<MovieDetails>
和一个 MovieDetailsAdapter
即可。 (如果你需要,你可以把你的工作放在临时的)。
因此,您应该在适配器的代码中创建列表 public static
。
然后在Activity,而不是
@Override
protected void onCreate(Bundle savedInstanceState) {
...
MovieDetailsAdapter ca = new MovieDetailsAdapter(createList(5));
...
}
做
private MovieDetailsAdapter ca;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
ca = new MovieDetailsAdapter(createList(5));
...
}
将 createList 的通用 MovieDetails(使用大小)移动到另一个方法(我将其称为 makeGenericMovieDetails()
)。 (在 createList 中,只需在 for 循环中替换它即可。)
private MovieDetails makeGenericMovieDetails() {
MovieDetails moviedetails = new MovieDetails();
// The size of the list, but add one.
moviedetails.title= "Name" + (adapter.getSize() + 1);
Bitmap bit = resizeBitmap(getResources(), R.drawable.poster_example, 640, 955);
moviedetails.imageViewPoster = bit;
Bitmap bit2 = resizeBitmap(getResources(), R.drawable.fanart_example, 800, 450);
moviedetails.imageViewFanart = bit2;
return moviedetails;
}
现在,如果您想更改它,请执行此操作(调整大小后):
private void setMovieDetails(@Nullable Bitmap poster, @Nullable Bitmap fanart, @Nullable String title, int id) {
MovieDetails details;
boolean isAlreadyThere = true;
try {
details = ca.movieList.get(id);
} catch (IndexOutOfBoundsException e) {
isAlreadyThere = false;
// If we come with a bad ID we crash. No fun.
details = makeGenericMovieDetails();
}
if (poster != null)
details.imageViewPoster = poster;
if (fanart != null)
details.imageViewFanart = fanart;
if (title != null)
details.Title = title;
ca.movieList.set(id, details);
if (isAlreadyThere) {
ca.notifyItemChanged(id);
} else {
ca.notifyItemInserted(id);
}
}
这里的重点是
ca.notifyItemChanged(id);
告诉适配器更新该项目。
我希望这能奏效,我正在从 StackExchange 的应用程序中执行此操作,但它一直在丢失草稿,所以请先进行测试。
现在,当您想要更改图片时,只需调用 setMovieDetails(poster, fanart, title, id);
并为您不想更改的值传递 null。 (除了 id)。
顺便说一句,尝试让变量以小写字母开头。因此,不要使用 Title
,而是使用 title
或 mTitle
。更好看,更容易区分。