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

Я пытаюсь открыть новый фрагмент, выбрав изображение из представления карты в представлении переработчика.Предпочтительно использовать как адаптер, так и классы фрагментов.Как мне это сделать?

Это мой класс адаптера:

public class CorporateAdapter extends RecyclerView.Adapter {

private int[] images = {
        R.drawable.sample1,
        R.drawable.sample2
};

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.corporate_list_row, viewGroup, false);
    final MyViewHolder vHold = new MyViewHolder(view);
    return vHold;
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {

    ((MyViewHolder) viewHolder).bindView(i);
}

@Override
public int getItemCount() {
    return images.length;
}

private class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

    private ImageView mImageView;

    public MyViewHolder(View itemView) {
        super(itemView);
        mImageView = (ImageView) itemView.findViewById(R.id.showImage);
        mImageView.setOnClickListener(this);

    }

    public void bindView(int position) {

        mImageView.setImageResource(images[position]);

    }

    @Override
    public void onClick(View v) {
    }
}

Это мой класс Fragment:

public class CorporateFragment extends Fragment {

private final int LAYOUT_LISTCORPORATE_FRAGMENT = R.layout.corporate_membership;

private View v;
private Date date;

private RecyclerView recyclerView;
private RecyclerView.LayoutManager layoutManager;

public CorporateFragment() {

}

public static CorporateFragment newInstance(Date date) {
    CorporateFragment fragment = new CorporateFragment();
    Bundle args = new Bundle();
    //args.putSerializable(ARG_DATE,date);
    fragment.setArguments(args);
    return fragment;
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    v = inflater.inflate(LAYOUT_LISTCORPORATE_FRAGMENT, container, false);
    ButterKnife.bind(this, v);

    return v;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {

    recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);
    final CorporateAdapter listAdapter = new CorporateAdapter();
    recyclerView.setAdapter(listAdapter);
    layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);

}

Я видел несколько способов, гдемы можем открыть новый фрагмент прямо из адаптера, но более правильным способом было бы использование Onclicklistener как в классе фрагмента, так и в классе адаптера.

Можно ли как-нибудь это сделать?Спасибо

1 Ответ

0 голосов
/ 11 декабря 2018

Вот пример для Вас, вставьте как есть.Создайте конструктор, который будет иметь интерфейс в качестве параметра в адаптере, и переопределите его во Fragment.

Ваш код фрагмента будет выглядеть следующим образом.

public class CorporateFragment extends Fragment {

    private final int LAYOUT_LISTCORPORATE_FRAGMENT = R.layout.corporate_membership;

    private View v;
    private Date date;

    private RecyclerView recyclerView;
    private RecyclerView.LayoutManager layoutManager;

    public CorporateFragment() {

    }

    private int[] images = {
            R.drawable.sample1,
            R.drawable.sample2
    };

    public static CorporateFragment newInstance(Date date) {
        CorporateFragment fragment = new CorporateFragment();
        Bundle args = new Bundle();
        //args.putSerializable(ARG_DATE,date);
        fragment.setArguments(args);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        // Inflate the layout for this fragment
        v = inflater.inflate(LAYOUT_LISTCORPORATE_FRAGMENT, container, false);
        ButterKnife.bind(this, v);

        return v;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {

        recyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);
        final CorporateAdapter listAdapter = new CorporateAdapter(getActivity(), images, new CorporateAdapter.onItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                /////////////////// do your on Click Stuff here...
                /////////// for ex .. go to next fragment
            }
        });
        recyclerView.setAdapter(listAdapter);
        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);

    }
}

И ваш адаптер настроен так:

 public class CorporateAdapter extends RecyclerView.Adapter<CorporateAdapter.MyViewHolder> {

     Context context;
     private int[] images;
     onItemClickListener onItemClickListener;

     public CorporateAdapter(Context context, int[] images, CorporateAdapter.onItemClickListener onItemClickListener) {
         this.context = context;
         this.images = images;
         this.onItemClickListener = onItemClickListener;
     }

     @Override
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.corporate_list_row, viewGroup, false);
        final MyViewHolder vHold = new MyViewHolder(view);
        return vHold;
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {


        ((MyViewHolder) holder).bindView(position);

        holder.mImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onItemClickListener.onItemClick(view,position);
            }
        });

    }


    @Override
    public int getItemCount() {
        return images.length;
    }

    private class MyViewHolder extends RecyclerView.ViewHolder {

        private ImageView mImageView;

        public MyViewHolder(View itemView) {
            super(itemView);
            mImageView = (ImageView) itemView.findViewById(R.id.showImage);

        }

        public void bindView(int position) {

            mImageView.setImageResource(images[position]);

        }

    }

    public interface onItemClickListener{
        void onItemClick(View view , int position);
    }
}

Надеюсь, это поможет.Удачи

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