繁体   English   中英

通过MainActivity在ListAdapter中的项目上设置onClickListener

[英]Set onClickListener via MainActivity on an item in a ListAdapter

如何为我的班级创建自定义setOnClickListener?

我目前有一个带物品的listAdapter(制造一个物品类)。 每当我单击该列表中的项目时,我都想激活MainActivity中描述的功能。 我想在列表适配器中的类上设置onClickListeners(自定义onClickListeners)。 我该怎么办?

如果您不了解我,或想提供帮助,我会压缩该项目并将其放在我的Google云端硬盘中

我已经浏览了数十个答案,但找不到有效的答案。请提供帮助,因为我已经花了很多时间在此上。

Item item = new Item().setOnClickListener(new ItemListAdapter.ClickListener() {
    @Override
    public void onClick() {
        Toast.makeText(MainActivity.this, "Clicked me", Toast.LENGTH_SHORT).show();
    }
});

编辑:因为我想稍后将其转换为库,所以对我和用户来说很有用,您可以设置对项目而不是列表视图的onclick设置,而最终希望向用户隐藏该列表视图

据我了解,您正在寻找类似的东西,改变这样的班级,

public class Item {

    private int id;
    private ItemListAdapter.ClickListener mClickListener;

    public Item(int id) {
        this.id = id;
    }


    public Item(int id, @NonNull ItemListAdapter.ClickListener clickListener) {
        this.id = id;
        this.mClickListener = clickListener;
    }


    public Item setOnClickListener(@NonNull ItemListAdapter.ClickListener clickListener) {
        this.mClickListener = clickListener;
        return this;
    }


    public ItemListAdapter.ClickListener getClickListener() {
        return this.mClickListener;
    }

}

转接器类别

import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;

public class ItemListAdapter extends ArrayAdapter<Item> {


    public ItemListAdapter(Context context, int resource) {
        super(context, resource, SettingsStorage.getInstance().getItems());
    }

    @NonNull
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {


        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.item, parent, false);
        }

        final Item item = getItem(position);
        LinearLayout linearLayout = (LinearLayout) convertView.findViewById(R.id.item);
        linearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (item.getClickListener() != null) {
                    item.getClickListener().onClick();
                }
            }
        });

        return convertView;
    }

    public interface ClickListener {
        void onClick();
    }
}

您可以像这样设置侦听器,

Item item1 = new Item(1);
        item1.setOnClickListener(new ItemListAdapter.ClickListener() {
            @Override
            public void onClick() {
                Toast.makeText(MainActivity.this, "It works", Toast.LENGTH_SHORT).show();
            }
        });
        Item item2 = new Item(2, new ItemListAdapter.ClickListener() {
            @Override
            public void onClick() {

            }
        });

您可以使用OnItemClickListener

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Item item = adapter.getItem(position);
    }
});

编辑:Item只是一个POJO,您不能对其“单击”。 您可以做的是“转发”侦听器:

Class Item {
    private ItemClickListener listener;

    // getter / setter

    interface ItemClickListener{
        void onItemClick(Item item);
    }
}

// you implement this in your library
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Item item = adapter.getItem(position);
        item.getListener().onItemClick(item);
    }
});

如果要将点击侦听器设置为整行,则“ OnItemClickListner”是您要寻找的选项。

检查此: 带有OnItemClickListener android的ListView

但是,如果要在该行的某个项上设置点击监听器,则首先必须从该行中获取该项,然后您才可以执行任何操作。

检查此: 带有OnItemClickListener android的ListView

获取自定义适配器中的项目列表

暂无
暂无

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

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