的ViewHolder模式是什麼,推Android的開發者使用很長一段時間,和然後(正確地)用RecyclerViews強制它們,這個想法與簡單的ListView相反,它是在滾動時儘可能多地重用視圖以減少通貨膨脹和資源識別,ViewHolder應該被當作是被改變/沒有在RecyclerView中創建。
因此,將信息存儲在ViewHolde必須堅持的r不起作用。爲此,有很多其他的選擇。讓我們來看一個內部類,它將管理當前選定的視圖位置及其相關圖像。
比方說,我們有一個自定義ViewHolder象下面這樣:
public class ImageViewHolder extends RecyclerView.ViewHolder{
private ImageView iv;
public ImageViewHolder(View v){
iv = (ImageView) v.findViewById(R.id.iv);
}
public ImageVie getImageView(){
return iv;
}
}
,並利用這一觀點持有者是一個適配器DemoAdapter
,我們可以修改它看起來是這樣的:
public class DemoAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
public interface SelectionListener{
void onImageSelected(Bitmap bmp);
}
private static class SelectionHolder{
protected int position;
protected Bitmap originalBmp, newBmp;
public SelectionHolder(int position, Bitmap originalBmp,
Bitmap newBmp){
this.position = position;
this.originalBmp = originalBmp;
this.newBmp = newBmp
}
}
private SelectionHolder selectionHolder;
private SelectionListener selectionListener;
/*
Pre-existing Adapter functionality
*/
public void setSelectionListener(SelectionListener listener){
selectionListener = listener;
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
/*
Pre-existing onBindViewHolder code
*/
ImageView iv = holder.getImageView();
if(selectionHolder != null && selectionHolder.position == position)
iv.setImageBitmap(selectionHolder.newBmp);
else{
//set the image however you are doing it now
}
iv.setOnClickListener(
new new View.OnClickListener() {
@Override
public void onClick(View v) {
ImageView iv = (ImageView) v;
// Get the IV's current bmp
Bitmap originalBmp = getBitmapFromImageView(iv);
// Get the currently selected image's "new" image
// if it is null, set it to the original bmp
// this will initialize our "highlighting"
Bitmap newBmp = selectionHolder == null || selectionHolder.newBmp == null?
originalBmp: selectoinHolder.newBmp;
// set the selection holder
selectionHolder = new SelectionHolder(position, originalBmp, newBmp);
// notify our listener
if(selectionListener != null)
selectionListener.onImageSelected(bmp);
// refresh the adapter
DemoAdapter.this.notifyDataSetChanged();
}
});
}
private Bitmap getBitmapFromImageView(ImageView iv){
return ((BitmapDrawable)(iv.getDrawable()).getBitmap()
}
}
然後,如果我們有一個需要選定圖像的活動,也許將其顯示在它所託管的ImageView中
recyclerAdapter = new DemoAdapter(...);
recyclerAdapter.setSelectionListener(new SelectionListener(){
@Override
public void onImageSelected(Bitmap bmp){
// set the bmp to your image view or whatever you want
}
}
這可以通過自定義ViewHolder類來管理,方法/方法允許您管理該視圖中的圖像。 – zgc7009
請告訴我一些例子。我對android很陌生。請幫助我... –