简体   繁体   English

将点击侦听器添加到 PagerAdpater CardViews 中的两个按钮

[英]Adding click listener to two buttons in PagerAdpater CardViews

In my project, I have a PagerAdapter to inflate CardViews that hold text objects created by the user.在我的项目中,我有一个 PagerAdapter 来扩充 CardViews,这些 CardViews 包含用户创建的文本对象。

On each CardView I have edit and delete buttons to access methods to do with the ArrayList holding the text objects.在每个 CardView 上,我都有编辑和删除按钮来访问处理 ArrayList 保存文本对象的方法。

I have coded an interface in my adapter to handle clicks made within the text object creation activity.我在我的适配器中编写了一个接口来处理文本 object 创建活动中的点击。 However, my instatiateItem method in my adapter is now showing on the @Override annotation "Method does not override method from its superclass".但是,我的适配器中的 instatiateItem 方法现在显示在 @Override 注释上“方法不覆盖其超类中的方法”。 When I remove the @Override annotation I get an error in my Logcat:当我删除 @Override 注释时,我的 Logcat 中出现错误:

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

How do I implement a click listener for buttons on a CardView in a PagerAdapter?如何为 PagerAdapter 中 CardView 上的按钮实现点击监听器?

Adapter code:适配器代码:

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);
}

Activity code:活动代码:

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);
        }
    });
}

Your instantiateItem method does not override from it's superclass because you added an extra argument final onItemClickListener listener .您的instantiateItem方法不会从它的超类中覆盖,因为您添加了一个额外的参数final onItemClickListener listener

As you are using the same clickListener for all entries and passing the item position as an argument, I suggest that you pass the onItemClickListener in the adapter constructor, or just set it via由于您对所有条目使用相同的 clickListener 并将项目 position 作为参数传递,因此我建议您在适配器构造函数中传递onItemClickListener ,或者只是通过

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

Adapter code:适配器代码:

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);
}

And your Activity code could stay as it is.您的活动代码可以保持原样。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM