【问题标题】:Set onClickListener via MainActivity on an item in a ListAdapter通过 MainActivity 在 ListAdapter 中的项目上设置 onClickListener
【发布时间】:2017-05-09 05:03:48
【问题描述】:

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

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

如果你不明白我的意思,或者想帮忙,我将项目压缩并放在我的Google Drive

我已经浏览了几十个答案,但我就是找不到那个有效的答案。请帮忙,因为我在这方面投入了很多时间。

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

编辑:因为我想稍后把它变成一个库,所以对我和用户来说,你可以在一个项目上设置一个 onclick 而不是我想隐藏的列表视图,这对我很有用最终用户

【问题讨论】:

  • 你到底想用逻辑做什么?
  • 我已经编辑了我的问题,也许这可以解释我到底想要什么
  • 为什么要在activity中实现ClickListener?有什么原因吗?
  • 这是我唯一能想到的自定义监听器。我忘记了有一个 onItemClickListener,而是做了这个。
  • 你能检查我的答案并告诉我它是否有效。

标签: java android listview listener android-arrayadapter


【解决方案1】:

据我了解,您正在寻找这样的东西,像这样更改课程,

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() {

            }
        });

【讨论】:

  • 你。是。我的。英雄。太感谢了!我浪费了过去两周的时间,你帮我解决了!真是太感谢你了!
  • 但我建议在点击监听器中传递项目。
  • 好的!明天再看看(已经快 12 点了),谢谢!
【解决方案2】:

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

检查这个:ListView with OnItemClickListener android

但是,如果您想在该行的某个项目上设置点击侦听器,那么首先您必须从行中获取该项目,然后您可以做任何您想做的事情。

检查这个:ListView with OnItemClickListener android

Get list of items in custom adapter

【讨论】:

    【解决方案3】:

    你可以使用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);
        }
    });
    

    【讨论】:

    • 我知道,但由于它会生成一个库,我希望选择执行 item.setOnClickListener 而不是用户访问列表视图本身
    • 我见过其他图书馆也做过同样的事情,但我似乎无法重现……例如 Mike penz 的“材料抽屉”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多