gpt4 book ai didi

java - 在创建 CardView 并将其放入 RecyclerView 后访问 CardView 中的项目

转载 作者:行者123 更新时间:2023-11-30 01:54:20 27 4
gpt4 key购买 nike

我想弄清楚如何在创建并传递 CardView 后修改某个 ImageViewTextView 小部件到主 RecyclerView。

所以我的代码如下:

首先是保存项目的类:

 public class MovieDetails {
protected static String title;
protected static Bitmap imageViewPoster;
protected static Bitmap imageViewFanart;}

现在我有 RecyclerView Adapter,它也包含 ViewHolder 内部类,如下所示:

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 类,我在其中设置布局和 View 并创建 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 类修改其中的 ImageView 和 TextView 吗?我想这样做,因为我正在使用 AsyncTask 来检索我想要替换的新图像,所以我首先必须用一些“默认”图像初始化位图,然后再从用于 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 .它看起来更好,更容易区分。

关于java - 在创建 CardView 并将其放入 RecyclerView 后访问 CardView 中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32512561/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com