2017-04-04 77 views
-1

我想加載一個RecyclerAdapter中包含的ImageView中的縮略圖圖像,但這需要一個上下文。從RecyclerAdapter可以獲取我的應用程序的MainActivity的上下文嗎?我想要這樣做,還是應該在其他地方加載圖像?如何從RecyclerAdapter使用Picasso加載圖像?

這些是我的課程。 RecyclerAdapater當然不會編譯,但它代表了我正在嘗試做的事情。

MainActivity:

public class MainActivity extends AppCompatActivity implements MainScreenContract.View { 

    ArrayList<String> list; 

    // Objects for RecyclerView 
    private RecyclerView recyclerView; 
    private RecyclerView.Adapter recyclerAdapter; 
    private RecyclerView.LayoutManager recyclerLayoutManager; 

    @Inject 
    MainScreenPresenter mainPresenter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Timber.plant(new Timber.DebugTree() { 
      // Add the line number to the tag 
      @Override 
      protected String createStackElementTag(StackTraceElement element) { 
       return super.createStackElementTag(element) + ':' + element.getLineNumber(); 
      } 
     }); 

     // RecyclerView implementation 
     recyclerView = (RecyclerView) findViewById(R.id.my_list); 
     // set to true because all images will be the same size 
     recyclerView.setHasFixedSize(true); 

     recyclerLayoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(recyclerLayoutManager); 


     DaggerMainScreenComponent.builder() 
       .netComponent(((App) getApplicationContext()).getNetComponent()) 
       .mainScreenModule(new MainScreenModule(this)) 
       .build().inject(this); 

     //Call the method in MainPresenter to make Network Request 
     mainPresenter.loadVideo(); 
    } 

    @Override 
    public void showVideos(Video video){ 
     // Loop through the posts, get the title of the post, and add it to our list object 
     // TODO: Simplify these references with a variable? 
     for(int i = 0; i < video.getResults().size(); i++){ 
      // TODO: add second for loop, or simplyfy and get rid of Video object 
      list.add(video.getResults().get(i).getSiteDetailUrl()); 
      //list.add(video.get(i).getSiteDetailUrl()); 
      Timber.d("List item " + i + " = " + list.get(i)); 
     } 

     // RecyclerView implementation 
     recyclerAdapter = new MainScreenRecyclerAdapter(list); 
     recyclerView.setAdapter(recyclerAdapter); 
    } 

    @Override 
    public void showError(String message){ 
     // Show error message text as a Toast message 
     Toast.makeText(getApplicationContext(), "Error" + message, Toast.LENGTH_SHORT).show(); 
     Timber.e("Error: " + message); 
    } 

    @Override 
    public void showComplete(){ 
     // Show completed Toast message 
     Toast.makeText(getApplicationContext(), "Complete", Toast.LENGTH_SHORT).show(); 
    } 
} 

RecyclerAdapter:

public class MainScreenRecyclerAdapter extends RecyclerView.Adapter<MainScreenRecyclerAdapter.ViewHolder> { 

    private List<String> dataset; 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public ImageView imageView; 
     public ViewHolder(ImageView v) { 
      super(v); 
      imageView = v; 
     } 
    } 

    // TODO: Should I make the list contain Video/Result objects and pull the data from that? 
    public MainScreenRecyclerAdapter(List<String> dataset) { 
     dataset = dataset; 
    } 

    // Create new views 
    @Override 
    public MainScreenRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     // create a new view 
     ImageView v = (ImageView) LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.thumbnail_view, parent, false); 

     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    // Replace the contents of a view (invoked by the layout manager) 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     // - get element from dataset at this position 
     // - replace the contents of hte view with that element 
     // TODO: Call to picasso to load image into holder.imageView 

     String imageUrl = dataset.get(position); 
     Timber.d("Image URL: " + imageUrl); 

     ImageView view = holder.imageView; 

     Picasso.with(MainActivity.context).load(imageUrl).into(view); 
    } 

    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     return dataset.size(); 
    } 
} 

謝謝!

回答

1

你需要通過上下文構造函數的參數,然後用此背景下

private Context mContext; 
public MainScreenRecyclerAdapter (Context context) { 
    mContext = context; 
} 


@Override 
    public void onBindViewHolder(ViewHolder holder, int position) {  
     String imageUrl = dataset.get(position); 
     Timber.d("Image URL: " + imageUrl); 

     ImageView view = holder.imageView; 

     Picasso.with(MainActivity.context).load(imageUrl).into(view); 
    } 
+0

媽的,這是很明顯的......謝謝。雖然現在我得到了RecyclerView的「沒有附加適配器;跳過佈局」錯誤消息。 – intA

+1

看這個答案.http://stackoverflow.com/a/30581896/3998402 不要忘記標記答案爲接受,如果它解決了你的問題。 – humazed

相關問題