[英]How can I open an image from a RecyclerView in a separate activity?
我正在使用的應用程序當前包含顯示多個圖像的畫廊視圖。 這些在recycler view
。 我最終想要實現的是讓用戶點擊其中一張圖像,並在單獨的活動中將其作為image view
打開。 我希望我能學到最好的方法。 我在搜索中找不到它,請原諒我,我對編碼還是很陌生。
畫廊活動:
import android.app.ActionBar; import android.content.Intent; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import java.util.ArrayList; public class GalleryActivity extends AppCompatActivity { private final Integer image_ids[] = { //all of my image ids from drawable// }; @Override public void onBackPressed() { Intent returnhome = new Intent(GalleryActivity.this, BleachActivity.class); startActivity(returnhome); finish(); return; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gallery); android.support.v7.app.ActionBar actionBar = getSupportActionBar(); actionBar.setTitle("//name of app//"); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.gallery); recyclerView.setHasFixedSize(false); RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(), 3); recyclerView.setLayoutManager(layoutManager); ArrayList<Cell> cells = prepareData(); MyAdapter adapter = new MyAdapter(getApplicationContext(), cells); recyclerView.setAdapter(adapter); } private ArrayList<Cell> prepareData() { ArrayList<Cell> theImage = new ArrayList<>(); for(int i = 0; i < image_ids.length; i++){ Cell cell = new Cell(); cell.setImg(image_ids[i]); theImage.add(cell); } return theImage; }}
單元格Java文件:
public class Cell { private Integer img; public Integer getImg() { return img; } public void setImg(Integer img) { this.img = img; } }
圖像適配器Java文件:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private ArrayList<Cell> galleryList; private Context context; public MyAdapter (Context context, ArrayList<Cell> galleryList){ this.galleryList = galleryList; this.context = context; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, final int i) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cell, viewGroup, false); return new ViewHolder(view);} @Override public void onBindViewHolder(MyAdapter.ViewHolder viewHolder, final int i){ viewHolder.img.setScaleType(ImageView.ScaleType.CENTER_CROP); viewHolder.img.setImageResource(galleryList.get(i).getImg()); viewHolder.img.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { } }); } @Override public int getItemCount(){ return galleryList.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ private ImageView img; public ViewHolder(View view){ super(view); img = (ImageView) view.findViewById(R.id.img); } } }
您首先創建一個新的活動,該活動將保存該圖像,並說ImageViewActivity。 然后您有多種選擇,我們將審查其中兩個。
簡單的選擇不是很好(不是明智的建築選擇)
從適配器開始活動
@Override
public void onBindViewHolder(MyAdapter.ViewHolder viewHolder, final int i){
viewHolder.img.setScaleType(ImageView.ScaleType.CENTER_CROP);
viewHolder.img.setImageResource(galleryList.get(i).getImg());
viewHolder.img.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent(context, ImageViewActivity.class);
context.startActivity(intent);
}
});
}
更好的方法
更好的方法是使用委托模式。 說明:單擊項目不是適配器的責任。 因此,為了簡單起見,知識應該在您的活動中。
MyAdapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
public class Delegate {
public void onClick(int imageResource);
}
private Delegate delegate;
public MyAdapter (Context context, ArrayList<Cell> galleryList, Delegate delegate){
this.galleryList = galleryList;
this.context = context;
this.delegate = delegate;
}
...
@Override
public void onBindViewHolder(MyAdapter.ViewHolder viewHolder, final int i){
viewHolder.img.setScaleType(ImageView.ScaleType.CENTER_CROP);
viewHolder.img.setImageResource(galleryList.get(i).getImg());
viewHolder.img.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
delegate.onClick(galleryList.get(i).getImg());
}
});
}
}
GalleryActivity
public class GalleryActivity extends AppCompatActivity implements MyAdapter.Delegate {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_gallery);
...
MyAdapter adapter = new MyAdapter(getApplicationContext(), cells, this);
recyclerView.setAdapter(adapter);
...
}
@Override
public void onClick() {
Intent intent = new Intent(this, ImageViewActivity.class);
context.startActivity(intent);
}
}
如果您真的對代碼的哪一部分感興趣,可以看一下MVC,MVP,MVVM或Clean Architecture等架構模式(后者應該會取代其余的)。 Google提供了具有不同架構的示例項目: https : //github.com/googlesamples/android-architecture
您可以在適配器中制作一個方法,該方法使用單擊的項目信息,並將其作為額外的方法傳遞給活動。
例如:
viewHolder.img.setImageResource(galleryList.get(i).getImg());
您可以使用此行獲取圖像並將其添加為附加圖像。
要獲取特定的項目數據,可以在適配器的視圖保持器中使用類似以下的內容:
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = getAdapterPosition();
galleryList.get(pos).getImg());
}
}
然后通過添加完成工作。
Intent myIntent = new Intent(A.this, B.class);
myIntent.putExtra("extraName", value);
startActivity(myIntent);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.