簡體   English   中英

如何在單獨的活動中從RecyclerView打開圖像?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM