получить позицию элемента программы просмотра, когда я нажимаю на кнопку с изображением - PullRequest
0 голосов
/ 27 июня 2018

вот метод, который я использую, чтобы получить позицию предметов для рециркулятора и выполнить точное действие с:

@Override
public void onItemClicked(RecyclerView recyclerView, int position, View v) {

}

Я поместил кнопку image в файл, который раздувает мое представление о переработчике, как показано на этом рисунке: image

моя кнопка images находится в активности, которая воспроизводит видео, как показано на этом рисунке. [![образ] вот мой адаптер:

public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private Context context;
private LayoutInflater inflater;
private List<Data> data= Collections.emptyList();
Data current;
private int currentPos=0;

// create constructor to innitilize context and data sent from MainActivity
public Adapter(Context context, List<Data> data){
    this.context=context;
    inflater= LayoutInflater.from(context);
    this.data=data;
}

// Inflate the layout when viewholder created
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view=inflater.inflate(R.layout.container, parent,false);
    MyHolder holder=new MyHolder(view);
    return holder;
}

// Bind data
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    // Obtenir la position actuelle de l'élément dans recyclerview pour lier les données et affecter des valeurs à partir de la liste
    MyHolder myHolder= (MyHolder) holder;
    Data current = data.get(position);

    myHolder.textFishName.setText(current.catName);
    myHolder.textSize.setText(current.sizeName);
    myHolder.textSize.setVisibility(View.GONE);
    myHolder.textType.setText(current.fishName);
    myHolder.id.setText(""+current.idServer+"");
    myHolder.textPrice.setText("" + current.price + "");
    myHolder.textPrice.setVisibility(View.GONE);
    myHolder.textPrice.setTextColor(ContextCompat.getColor(context, R.color.colorAccent));

    // load image into imageview using glide
    Glide.with(context).load("http://192.168.43.196/vibe2/images/" + current.fishImage)
            .placeholder(R.drawable.ic_menu_camera)
            .error(R.drawable.ic_menu_camera)
            .into(myHolder.ivFish);
}

// return total item from List
@Override
public int getItemCount() {
    return data.size();
}


class MyHolder extends RecyclerView.ViewHolder {

    TextView textFishName;
    ImageView ivFish;
    TextView textSize;
    TextView textType;
    TextView textPrice;
    TextView counter;
    TextView id;

    // create constructor to get widget reference
    public MyHolder(View itemView) {
        super(itemView);
        textFishName = itemView.findViewById(R.id.textFishName);
        ivFish = itemView.findViewById(R.id.ivFish);
        textSize = itemView.findViewById(R.id.textSize);
        textType = itemView.findViewById(R.id.textType);
        textPrice = itemView.findViewById(R.id.textPrice);
        counter = itemView.findViewById(R.id.counter);
        id = itemView.findViewById(R.id.id);
    }
}

}

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Попробуйте этот код .. превратить интерфейс в класс адаптера и обработать событие click, как показано ниже: ..

    OnItemClick onItemClick;

public void setOnItemClick(OnItemClick onItemClick) {
    this.onItemClick = onItemClick;
}

public interface OnItemClick {
    void getPosition(int pos); //pass any things
}

затем после ..

   @Override
public void onBindViewHolder(ItemViewHolder holder, final int position) {
    // below code handle click event on recycler view item.
    String data = mStringList.get(position);
    holder.textView.setText(data);
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onItemClick.getPosition(position);
        }
    });
}

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

       adpater.setOnItemClick(new RecyclerViewAdpater.OnItemClick() {
        @Override
        public void getPosition(int pos) {
            Toast.makeText(getApplicationContext(),"Click Item Postion::"+pos,Toast.LENGTH_SHORT).show();
        }
    });
0 голосов
/ 28 июня 2018

Вы должны сделать это внутри ViewHolder, а не в onBindViewHolder, поскольку он вызывается каждый раз, когда элемент перерисовывается.

...
// create constructor to get widget reference
public MyHolder(View itemView) {
    super(itemView);
    ...
    ivFish = itemView.findViewById(R.id.ivFish);
    ...

    ivFish.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(getAdapterPosition() != -1) { // Avoid Exception
                // use getAdapterPosition() to get the current position             
            }                
        }
    });
}

Кроме того, вы можете передать интерфейс к вашему адаптеру RecyclerView, вызвать этот интерфейс внутри ClickListener и выполнить желаемое действие внутри вашего фрагмента / действия.

0 голосов
/ 27 июня 2018

Это может быть заархивировано с помощью интерфейса от активности к ViewHolder RecyclerView. В ViewHolder вы можете реализовать onClickListener, в котором вы можете передать даже клик и необходимую информацию из ViewHolder.

    public class Adapter extends RecyclerView.Adapter<MyHolder> {

    private Context context;
    private LayoutInflater inflater;
    private List<Data> data= Collections.emptyList();
    Data current;
    private int currentPos=0;
    // Custom listener to relay to selected data from ViewHolder to Activity
    private AdapterListener adapterListener;

    // create constructor to innitilize context and data sent from MainActivity
    public Adapter(Context context, List<Data> data, AdapterListener adapterListener){
        this.context=context;
        inflater= LayoutInflater.from(context);
        this.data=data;
        this.adapterListener = adapterListener;
    }

    // Inflate the layout when viewholder created
    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view=inflater.inflate(R.layout.container, parent,false);
        MyHolder holder=new MyHolder(view, adapterListener);
        return holder;
    }

    // Bind data
    @Override
    public void onBindViewHolder(MyHolder holder, int position) {

        // Obtenir la position actuelle de l'élément dans recyclerview pour lier les données et affecter des valeurs à partir de la liste
        MyHolder myHolder= (MyHolder) holder;
        myHolder.setData(data.get(position));


    }

    // return total item from List
    @Override
    public int getItemCount() {
        return data.size();
    }
}

public class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView textFishName;
    ImageView ivFish;
    TextView textSize;
    TextView textType;
    TextView textPrice;
    TextView counter;
    TextView id;
    Data data;

    // Adapter listener
    private AdapterListener adapterListener;

    // create constructor to get widget reference
    public MyHolder(View itemView, AdapterListener adapterListener) {
        super(itemView);
        textFishName = itemView.findViewById(R.id.textFishName);
        ivFish = itemView.findViewById(R.id.ivFish);
        textSize = itemView.findViewById(R.id.textSize);
        textType = itemView.findViewById(R.id.textType);
        textPrice = itemView.findViewById(R.id.textPrice);
        counter = itemView.findViewById(R.id.counter);
        id = itemView.findViewById(R.id.id);
        this.adapterListener = adapterListener;
    }

    public void setData(Data data){
        this.data = data;
        textFishName.setText(current.catName);
        textSize.setText(current.sizeName);
        textSize.setVisibility(View.GONE);
        textType.setText(current.fishName);
        id.setText(""+current.idServer+"");
        textPrice.setText("" + current.price + "");
        textPrice.setVisibility(View.GONE);
        textPrice.setTextColor(ContextCompat.getColor(context, R.color.colorAccent));

        // load image into imageview using glide
        Glide.with(context).load("http://192.168.43.196/vibe2/images/" + current.fishImage)
                .placeholder(R.drawable.ic_menu_camera)
                .error(R.drawable.ic_menu_camera)
                .into(ivFish);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.ivFish:
                adapterListener.onClickImageView(getAdapterPosition(), data);
                break;
        }
    }
}

public interface AdapterListener {
    void onClickImageView(int position, Data data);
}

Наконец, реализуйте интерфейс AdapterListener в классе, где вы создаете Adapter.

...