在PagerAdapter的CardViews中添加点击监听器到两个按钮。

huangapple go评论64阅读模式
英文:

Adding click listener to two buttons in PagerAdpater CardViews

问题

在我的项目中,我有一个PagerAdapter用于填充由用户创建的文本对象所在的CardViews。

在每个CardView上,我有编辑和删除按钮,以访问与包含文本对象的ArrayList相关的方法。

我在我的适配器中编写了一个接口来处理在文本对象创建活动中进行的点击。然而,我的适配器中的instantiateItem方法现在显示在@Override注释中"方法未覆盖其超类的方法"。当我删除@Override注释时,我的Logcat中会出现错误:

java.lang.UnsupportedOperationException: 必须覆盖方法instantiateItem

如何在PagerAdapter中为CardView上的按钮实现点击监听器?

适配器代码:

public class CreateAdapter extends PagerAdapter {

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

    public interface onItemClickListener{
        // 编辑按钮的点击方法
        void onEditClick(int position);
        // 删除按钮的点击方法
        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().equals("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);

            // 设置文本内容
            inputText.setText(pagesList.get(position).getPageText());

            // 编辑按钮点击监听器
            editButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mListener != null){
                        int position2 = pagesList.indexOf(pagesList.get(position));
                        mListener.onEditClick(position2);
                    }
                }
            });

            // 删除按钮点击监听器
            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);
        }

        // 在这里放置用于图像CardView的else语句

        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);
            }
        });
    }
}
英文:

In my project, I have a PagerAdapter to inflate CardViews that hold text objects created by the user.

On each CardView I have edit and delete buttons to access methods to do with the ArrayList holding the text objects.

I have coded an interface in my adapter to handle clicks made within the text object creation activity. However, my instatiateItem method in my adapter is now showing on the @Override annotation "Method does not override method from its superclass". When I remove the @Override annotation I get an error in my 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?

Adapter code:

public class CreateAdapter extends PagerAdapter {
private List&lt;PdfPage&gt; 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&lt;PdfPage&gt; 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() == &quot;Text&quot;) {
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&lt;PdfPage&gt; pdfPageList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create);
pdfPageList = new ArrayList&lt;&gt;();
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

您的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{
    //编辑按钮的点击方法
    void onEditClick(int position);
    //删除按钮的点击方法
    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().equals("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);

        //如果这个工作,查看视频中12:30的图像获取器
        inputText.setText(pagesList.get(position).getPageText());

        //编辑点击监听器
        editButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null){
                    mListener.onEditClick(position);
                }
            }
        });

        //删除点击监听器
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null){
                    mListener.onDeleteClick(position);
                }
            }
        });

        container.addView(view, 0);

    }

    //在这里添加图像cardView的else语句

    assert view != null;
    return view;
}

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

您的Activity代码可以保持不变。

英文:

Your instantiateItem method does not override from it's superclass because you added an extra argument 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

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

Adapter code:

public class CreateAdapter extends PagerAdapter {
private List&lt;PdfPage&gt; 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&lt;PdfPage&gt; 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() == &quot;Text&quot;) {
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.

huangapple
  • 本文由 发表于 2020年8月4日 20:08:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/63246582.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定