通过 MainActivity 在 ListAdapter 中的项目上设置 onClickListener
Set onClickListener via MainActivity on an item in a ListAdapter
如何为我的 class 创建自定义 setOnClickListener?
我目前有一个带有项目的 listAdapter(制作了一个项目 Class)。每当我单击该列表中的一个项目时,我都想激活我在 MainActivity 中描述的功能。我想在列表适配器中的 classes 上设置 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 而不是我想要的列表视图最终对用户隐藏
您可以使用 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,你不能 "click" 在上面。您可以做的是 "forwarding" 听众:
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" 就是您要查找的选项。
检查这个:ListView with OnItemClickListener android
但是如果你想在行中的一个项目上设置点击侦听器,那么首先你必须从行中获取该项目然后你可以做任何你想做的事。
检查这个:ListView with OnItemClickListener android
Get list of items in custom adapter
根据我的理解,您正在寻找这样的东西,像这样更改 class,
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;
}
}
适配器class
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() {
}
});
如何为我的 class 创建自定义 setOnClickListener?
我目前有一个带有项目的 listAdapter(制作了一个项目 Class)。每当我单击该列表中的一个项目时,我都想激活我在 MainActivity 中描述的功能。我想在列表适配器中的 classes 上设置 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 而不是我想要的列表视图最终对用户隐藏
您可以使用 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,你不能 "click" 在上面。您可以做的是 "forwarding" 听众:
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" 就是您要查找的选项。
检查这个:ListView with OnItemClickListener android
但是如果你想在行中的一个项目上设置点击侦听器,那么首先你必须从行中获取该项目然后你可以做任何你想做的事。
检查这个:ListView with OnItemClickListener android
Get list of items in custom adapter
根据我的理解,您正在寻找这样的东西,像这样更改 class,
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;
}
}
适配器class
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() {
}
});