Добавление прослушивателя кликов к двум кнопкам в PagerAdpater CardViews - PullRequest
1 голос
/ 04 августа 2020

В моем проекте у меня есть PagerAdapter для надувания CardViews, которые содержат текстовые объекты, созданные пользователем.

На каждом CardView у меня есть кнопки редактирования и удаления для доступа к методам, связанным с ArrayList, содержащим текстовые объекты .

Я закодировал интерфейс в своем адаптере для обработки щелчков, сделанных в процессе создания текстового объекта. Однако мой метод instatiateItem в моем адаптере теперь отображается в аннотации @Override «Метод не переопределяет метод из своего суперкласса». Когда я удаляю аннотацию @Override, я получаю сообщение об ошибке в моем Logcat:

java.lang.UnsupportedOperationException: Required method instantiateItem was not overridden

Как реализовать прослушиватель кликов для кнопок в CardView в PagerAdapter?

Код адаптера:

public class CreateAdapter extends PagerAdapter {

private List<PdfPage> pagesList;
private LayoutInflater layoutInflater;
private Context context;
private onItemClickListener mListener;

public interface onItemClickListener{
    //click method for edit button
    void onEditClick(int position);
    //click method for delete button
    void onDeleteClick(int position);
}

public void setOnItemClickListener(onItemClickListener listener){
    mListener = listener;
}

public CreateAdapter(List<PdfPage> pagesList, Context context) {
    this.pagesList = pagesList;
    this.context = context;
}

@Override
public int getCount() {
    return pagesList.size();
}

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
    return view.equals(object);
}

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, final int position, final onItemClickListener listener) {
    layoutInflater = LayoutInflater.from(context);
    View view = null;

    if(pagesList.get(position).getPageType() == "Text") {
        view = layoutInflater.inflate(R.layout.create_text_cardview, container, false);

        TextView inputText = view.findViewById(R.id.inputTextView);
        ImageButton editButton = view.findViewById(R.id.imageButtonEdit);
        ImageButton deleteButton = view.findViewById(R.id.imageButtonDelete);

        //if this works, see 12:30 of video for image getter
        inputText.setText(pagesList.get(position).getPageText());

        //edit click listener
        editButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null){
                    int position2 = pagesList.indexOf(pagesList.get(position));
                    listener.onEditClick(position2);
                }
            }
        });

        //delete click listener
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null){
                    int position3 = pagesList.indexOf(pagesList.get(position));
                    listener.onDeleteClick(position3);
                }
            }
        });

        container.addView(view, 0);

    }

    //put else statement here for image cardView

    assert view != null;
    return view;
}

@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    container.removeView((View)object);
}

Код активности:

public class CreateActivity extends AppCompatActivity {

ViewPager viewPager;
CreateAdapter createAdapter;
List<PdfPage> pdfPageList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_create);

    pdfPageList = new ArrayList<>();
    
    createAdapter = new CreateAdapter(pdfPageList, this);

    viewPager = findViewById(R.id.viewPager);
    viewPager.setAdapter(createAdapter);
    viewPager.setPadding(130, 0, 130, 0);

}

@Override
protected void onStart() {
    super.onStart();

    createAdapter = new CreateAdapter(pdfPageList, this);

    viewPager = findViewById(R.id.viewPager);
    viewPager.setAdapter(createAdapter);
    viewPager.setPadding(130, 0, 130, 0);

    createAdapter.setOnItemClickListener(new CreateAdapter.onItemClickListener() {
        @Override
        public void onEditClick(int position) {

        }

        @Override
        public void onDeleteClick(int position) {
            pdfPageList.remove(position);
        }
    });
}

1 Ответ

1 голос
/ 04 августа 2020

Ваш метод instantiateItem не переопределяет его суперкласс, потому что вы добавили дополнительный аргумент final onItemClickListener listener.

Поскольку вы используете один и тот же clickListener для всех записей и передаете позицию элемента в качестве аргумента, я Предлагаем передать onItemClickListener в конструктор адаптера или просто установить его с помощью

public void setOnItemClickListener(onItemClickListener listener){
    mListener = listener;
}

Код адаптера:

public class CreateAdapter extends PagerAdapter {

private List<PdfPage> pagesList;
private LayoutInflater layoutInflater;
private Context context;
private onItemClickListener mListener;

public interface onItemClickListener{
    //click method for edit button
    void onEditClick(int position);
    //click method for delete button
    void onDeleteClick(int position);
}

public void setOnItemClickListener(onItemClickListener listener){
    mListener = listener;
}

public CreateAdapter(List<PdfPage> pagesList, Context context) {
    this.pagesList = pagesList;
    this.context = context;
}

@Override
public int getCount() {
    return pagesList.size();
}

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
    return view.equals(object);
}

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, final int position) {
    layoutInflater = LayoutInflater.from(context);
    View view = null;

    if(pagesList.get(position).getPageType() == "Text") {
        view = layoutInflater.inflate(R.layout.create_text_cardview, container, false);

        TextView inputText = view.findViewById(R.id.inputTextView);
        ImageButton editButton = view.findViewById(R.id.imageButtonEdit);
        ImageButton deleteButton = view.findViewById(R.id.imageButtonDelete);

        //if this works, see 12:30 of video for image getter
        inputText.setText(pagesList.get(position).getPageText());

        //edit click listener
        editButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mlistener != null){
                    int position2 = pagesList.indexOf(pagesList.get(position));
                    mlistener.onEditClick(position2);
                }
            }
        });

        //delete click listener
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mlistener != null){
                    int position3 = pagesList.indexOf(pagesList.get(position));
                    mlistener.onDeleteClick(position3);
                }
            }
        });

        container.addView(view, 0);

    }

    //put else statement here for image cardView

    assert view != null;
    return view;
}

@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    container.removeView((View)object);
}

И ваш код действия может остаться как есть.

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