Java 在android中使用recycle视图中的adapter类更改xml属性时,项目会混淆
我有一个适配器类,它动态加载项目并在Java 在android中使用recycle视图中的adapter类更改xml属性时,项目会混淆,java,android,android-recyclerview,Java,Android,Android Recyclerview,我有一个适配器类,它动态加载项目并在RecyclerView中显示它们。我的问题是,当我在“回收者”视图中上下滑动时,图像会混在一起,并显示在错误的位置(即在其他项目的视图中) 例如,我有一个项目X和另一个项目Y。现在,当我上下滑动要在项目Y中显示的图像时,会在项目X中显示,其他属性也会出现同样的情况 以下是我的适配器类: public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.NewsViewHolder>
RecyclerView
中显示它们。我的问题是,当我在“回收者”视图中上下滑动时,图像会混在一起,并显示在错误的位置(即在其他项目的视图中)
例如,我有一个项目X和另一个项目Y。现在,当我上下滑动要在项目Y中显示的图像时,会在项目X中显示,其他属性也会出现同样的情况
以下是我的适配器类:
public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.NewsViewHolder> {
private DatabaseReference refDNewsTable= FirebaseDatabase.getInstance().getReference().child("news_feeds");
private StorageReference refStorage = FirebaseStorage.getInstance().getReferenceFromUrl("firebase_url_comes_here");
private Context mContext;
private List<NewsModel> newsList;
public class NewsViewHolder extends RecyclerView.ViewHolder {
public TextView nHeading, nDes,nDaTi;
public ImageView nImg;
public NewsViewHolder(View view) {
super(view);
nHeading = (TextView) view.findViewById(R.id.tv_newsHeadline);
nDes = (TextView) view.findViewById(R.id.tv_nDes);
nImg = (ImageView) view.findViewById(R.id.iv_nImg);
nDaTi=(TextView) view.findViewById(R.id.tv_nDaTi);
}
}
public NewsAdapter(Context mContext, List<NewsModel> newsList) {
this.mContext = mContext;
this.newsList = newsList;
}
@Override
public NewsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.news_model, parent, false);
return new NewsViewHolder(itemView);
}
@Override
public void onBindViewHolder(final NewsViewHolder holder, int position) {
NewsModel news = newsList.get(position);
holder.nHeading.setText(news.getnHeading());
if(news.hasDes()) {
holder.nDes.setText(news.getnDes());
}else{
holder.nDes.setVisibility(View.GONE);
}
if(news.hasImg()){
// Reference to an image file in Firebase Storage
StorageReference imgReference =refStorage.child(news.getnId());
// Load the image using Glide
Glide.with(mContext)
.using(new FirebaseImageLoader())
.load(imgReference)
.into(holder.nImg);
}else{
holder.nImg.setVisibility(View.GONE);
}
holder.nDaTi.setText(news.getnDaTi());
}
public void downloadFile(final NewsViewHolder holder){
try {
final File localFile = File.createTempFile("images", "jpg");
refStorage.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
Bitmap bitmap = BitmapFactory.decodeFile(localFile.getAbsolutePath());
holder.nImg.setImageBitmap(bitmap);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
}
});
} catch (IOException e ) {}
}
@Override
public int getItemCount() {
return newsList.size();
}
}
公共类NewsAdapter扩展了RecyclerView.Adapter{
private DatabaseReference refDNewsTable=FirebaseDatabase.getInstance().getReference().child(“新闻提要”);
private StorageReference refStorage=FirebaseStorage.getInstance().getReferenceFromUrl(“firebase\u url\u来这里”);
私有上下文;
私人列表新闻列表;
公共类NewsViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图、nDes、NDTI;
公众形象观;
公共新闻视图持有者(视图){
超级(视图);
nHeading=(TextView)view.findviewbyd(R.id.tv\u新闻标题);
nDes=(TextView)view.findViewById(R.id.tv\u nDes);
nImg=(ImageView)view.findViewById(R.id.iv_nImg);
nDaTi=(TextView)view.findViewById(R.id.tv\u nDaTi);
}
}
公共新闻适配器(上下文mContext、列表新闻列表){
this.mContext=mContext;
this.newsList=新闻列表;
}
@凌驾
public NewsViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.news\u模型,父项,假);
返回新的NewsViewHolder(itemView);
}
@凌驾
公共无效onBindViewHolder(最终新闻视图持有人,内部位置){
NewsModel news=newsList.get(位置);
holder.nHeading.setText(news.getnHeading());
if(news.hasDes()){
holder.nDes.setText(news.getnDes());
}否则{
支架nDes设置可见性(视图消失);
}
if(news.hasImg()){
//对Firebase存储中图像文件的引用
StorageReference imgReference=refStorage.child(news.getnId());
//使用Glide加载图像
使用(mContext)滑动
.使用(新的FireBaseMageLoader())
.加载(imgreeference)
.into(holder.nImg);
}否则{
holder.nImg.setVisibility(视图已消失);
}
holder.nDaTi.setText(news.getnDaTi());
}
公共作废下载文件(最终新闻持有人){
试一试{
最终文件localFile=File.createTempFile(“图像”、“jpg”);
refStorage.getFile(localFile).addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公共无效(FileDownloadTask.TaskSnapshot TaskSnapshot){
位图位图=BitmapFactory.decodeFile(localFile.getAbsolutePath());
holder.nImg.setImageBitmap(位图);
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
}
});
}捕获(IOE){}
}
@凌驾
public int getItemCount(){
返回newsList.size();
}
}
这是我的news_model.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:padding="10dp"
android:layout_margin="4dp"
card_view:cardPreventCornerOverlap="true"
card_view:cardElevation="16dp"
android:layout_height="wrap_content"
android:id="@+id/card_view"
android:layout_gravity="center"
card_view:cardCornerRadius="0dp">
<LinearLayout
android:orientation="vertical"
android:background="@color/cBgNews"
android:padding="0dp"
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:padding="10dp"
card_view:cardElevation="6dp"
card_view:cardBackgroundColor="@color/cNewsHeadline"
android:layout_height="wrap_content"
android:layout_marginTop="0dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="0dp"
android:id="@+id/card_des"
android:layout_gravity="center"
card_view:cardCornerRadius="0dp">
<TextView
android:text="TextView"
android:textSize="17sp"
android:textStyle="normal"
android:padding="10dp"
android:maxLines="3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/cWhite"
android:gravity="start"
android:layout_margin="0dp"
android:id="@+id/tv_newsHeadline" />
</android.support.v7.widget.CardView>
<LinearLayout
android:orientation="vertical"
android:gravity="center_horizontal"
android:background="#0000"
android:paddingEnd="6dp"
android:paddingStart="6dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="wrap_content"
android:layout_marginBottom="0dp"
android:layout_height="wrap_content"
android:maxHeight="300dp"
app:srcCompat="@mipmap/ic_launcher"
android:scaleType="fitCenter"
android:layout_gravity="center_horizontal"
android:id="@+id/iv_nImg" />
<TextView
android:text="Description..."
android:maxLines="8"
android:textSize="16sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:padding="10dp"
android:textColor="@color/cBlack"
android:id="@+id/tv_nDes" />
<TextView
android:text="Date and Time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="10sp"
android:textColor="#999999"
android:gravity="end"
android:id="@+id/tv_nDaTi" />
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
注意:我使用firebase直接接收内容,尚未在我的应用程序中创建任何类型的数据库。i、 e.每次需要数据时,它都会直接在适配器类中加载数据。“请告诉我为什么会发生这种情况”可能有一百万个原因,我们需要查看相关代码。不过要简短,做个手势。@weston给你。现在看看这个问题,我已经添加了所有与这个问题相关的内容。请帮助我,如果你可以,因为一切都在混乱与这件事窃听。尝试添加持有人。setIsRecyclable(假);在onBindChildViewHolder()中。我在处理本地数据库时也遇到了同样的问题。是的,
holder.setIsRecyclable(false)
,因为现在您没有回收视图。你没有解决这个问题,只是避开了它。没错,它太复杂了。发现问题太难了,问题可能在其他课程中。要启动一个MCVE,启动一个新的项目,添加一些内容,直到问题出现。删除任何不必要的内容,然后更新问题。人们可以看到问题中的每一段代码,而不是问题中多余的部分。