Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中使用recycle视图中的adapter类更改xml属性时,项目会混淆_Java_Android_Android Recyclerview - Fatal编程技术网

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,启动一个新的项目,添加一些内容,直到问题出现。删除任何不必要的内容,然后更新问题。人们可以看到问题中的每一段代码,而不是问题中多余的部分。