Как я могу открыть изображение из RecyclerView в отдельном упражнении? - PullRequest
0 голосов
/ 03 октября 2018

Приложение, над которым я сейчас работаю, включает в себя просмотр галереи с несколькими изображениями.Они показаны в 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);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Вы можете создать метод в адаптере, который использует информацию о выбранном элементе и передает ее в упражнение в качестве дополнительного.

Например:

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);
0 голосов
/ 03 октября 2018

Сначала вы создаете новое действие, которое содержит отображение изображений, например 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 или Чистая архитектура (более поздняя версия должна обогнать остальные).Есть примеры проектов, предоставляемых Google с различными архитектурами: https://github.com/googlesamples/android-architecture

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...