2

私はアンドロイドプロジェクトでFastAdapterを使用しています。ViewHolderは文字列をTextViewのテキストとして設定しません。詳細をご覧ください

これは私がそれを使用しています方法です。ここで

public class HRequest extends AbstractItem<HRequest, HRequest.ViewHolder> { 

     public String imageURL; 

     public HRequest() { 

     } 

     public HRequest(String imageURL) { 
      this.imageURL = imageURL; 
     } 

     // Fast Adapter methods 
     @Override 
     public int getType() { 
      return R.id.recycler_view; 
     } 
     @Override 
     public int getLayoutRes() { 
      return R.layout.h_request_list_row; 
     } 
     @Override 
     public void bindView(ViewHolder holder) { 
      super.bindView(holder); 

      holder.imageURL.setText(imageURL); 

     } 
     // Manually create the ViewHolder class 
     protected static class ViewHolder extends RecyclerView.ViewHolder { 

      TextView imageURL; 

      public ViewHolder(View itemView) { 
       super(itemView); 
       imageURL = (TextView)itemView.findViewById(R.id.imageURL); 

if (!imageURL.getText().toString().isEmpty()) { 

       Toast.makeText(itemView.getContext(), imageUID.getText().toString(), Toast.LENGTH_SHORT).show(); 

if (imageURL.getText().toString().startsWith("https://firebasestorage.googleapis.com/") || imageURL.getText().toString().startsWith("content://")) { 
        Picasso.with(itemView.getContext()) 
          .load(imageURL.getText().toString()) 
          .into(homelessImage); 
       } else { 
        Toast.makeText(itemView.getContext(), "some problem", Toast.LENGTH_SHORT).show(); 
       } 

      } else { 
       Toast.makeText(itemView.getContext(), "no imageUID found", Toast.LENGTH_SHORT).show(); 
      } 

      } 
     } 

    } 

R.layout.h_request_list_rowです:

<?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:layout_width="match_parent" 
       android:layout_height="match_parent" 
       xmlns:ads="http://schemas.android.com/apk/res-auto" 
       android:orientation="vertical" 
       xmlns:tools="http://schemas.android.com/tools"> 

      <TextView 
       android:id="@+id/imageURL" 
       android:text="imageURL" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"/> 

</LinearLayout> 

ここでの問題はimageURLは、データベースから取得imageURLとしてではなくimageURLとして設定取得されていないということですレイアウトファイルに定義されているため、イメージはダウンロードされません。私はこの主旨に従っ:https://gist.github.com/puf/f49a1b07e92952b44f2dc36d9af04e3c

私はここにString imageURLがいることを確信しています:

public HRequest(String imageURL) { 
      this.imageURL = imageURL; 
     } 

がFirebaseデータベースから取得したURLを正常にフェッチしています。

ここで何が問題になっているか教えてください。

申し訳ありませんが、質問のフォーマットが間違っています。私はまだ初心者です。

答えて

1

問題は、ViewHolderのイメージを読み込もうとしていることです。 ViewHolderが、これはViewHolderが作成された後と呼ばれるようImageUrlセットは、bindView方法を経由してまだ存在しなかった作成された時点で

したがって、イメージローディングロジックをメソッドに移動する必要があります。 ViewHolderは、RecyclerViewがビューを効率的にキャッシュし、リスナーを定義し、RecyclerViewで使用されているすべてのビューに「固定」されたものを保持するためだけにあります。

public class HRequest extends AbstractItem < HRequest, HRequest.ViewHolder > { 
    public String imageURL; 
    public HRequest() {} 
    public HRequest(String imageURL) { 
     this.imageURL = imageURL; 
    } 
    // Fast Adapter methods 
    @Override 
    public int getType() { 
     return R.id.recycler_view; 
    } 
    @Override 
    public int getLayoutRes() { 
     return R.layout.h_request_list_row; 
    } 
    @Override 
    public void bindView(ViewHolder holder) { 
     super.bindView(holder); 
     holder.imageURL.setText(imageURL); 

     if (!imageURL.isEmpty()) { 
      Toast.makeText(holder.itemView.getContext(), imageURL, Toast.LENGTH_SHORT).show(); 
      if (imageURL.startsWith("https://firebasestorage.googleapis.com/") || imageURL.startsWith("content://")) { 
       Picasso.with(holder.itemView.getContext()).cancelRequest(holder.myImageView); 
       Picasso.with(holder.itemView.getContext()).load(imageURL).into(holder.myImageView); 
      } else { 
       Toast.makeText(holder.itemView.getContext(), "some problem", Toast.LENGTH_SHORT).show(); 
      } 
     } else { 
      Toast.makeText(holder.itemView.getContext(), "no imageUID found", Toast.LENGTH_SHORT).show(); 
     } 
    } 
    // Manually create the ViewHolder class 
    protected static class ViewHolder extends RecyclerView.ViewHolder { 
     TextView imageURL; 
     ImageView myImageView; 
     public ViewHolder(View itemView) { 
      super(itemView); 
      imageURL = (TextView) itemView.findViewById(R.id.imageURL); 
      myImageView = (ImageView) itemView.findViewById(R.id.myImageView); 
     } 
    } 
} 

そこで、基本的RecyclerView項目が一覧に表示来るbindViewたびに呼び出されます、データがそれに適用する必要があります:あなたは、次のようにそれを変更する必要が働いて、あなたのコードを取得するには

。またViewHolderImageView自分自身を追加し、また新しいイメージが適用なっている最初の前に、ピカソとImageView上の要求をキャンセルする必要があり

+0

おかげで多く、先生(私もこのコードスニペットを追加しました)。問題は、 'bindView()'メソッドに画像読み込みロジックを置くときに 'itemView'というシンボルを解決できません。 –

+1

コードを調整しました – mikepenz

関連する問題