点击事件从适配器到Android的活动或片段 [英] Click event from Adapter to Activity or Fragment in Android
问题描述
我自定义显示在导航抽屉扩展列表视图。我有一个点击监听器适配器我想从适配器发送click事件给我的活动或片段。
这是可能的,如果让我怎么去这样做呢?
下面是我的适配器的一个片段:
公共类CustomAdapter实现ExpandableListAdapter {
@覆盖
公共查看getGroupView(INT位置,布尔isExpanded,查看convertView,ViewGroup中父){
如果(convertView == NULL){
convertView = inflater.inflate(R.layout.menu_item,父母,假);
}
TextView的文字=(TextView的)convertView.findViewById(android.R.id.text1);
text.setText(items.get(位置).getName());
ImageView的ImageView的=(ImageView的)convertView.findViewById(R.id.imageIndicator);
如果(items.get(位置).isHasChild()&安培;&安培; items.get(位置).getSubMenuItems()的大小()大于0)
imageView.setVisibility(View.VISIBLE);
其他
imageView.setVisibility(View.INVISIBLE);
如果(isExpanded)
imageView.setImageResource(R.drawable.down);
其他
imageView.setImageResource(R.drawable.next);
返回convertView;
}
@覆盖
公共查看getChildView(最终诠释childPosition,诠释groupPosition,布尔isExpanded,查看convertView,最终的ViewGroup父){
查看查看= convertView;
如果(查看== NULL){
鉴于= inflater.inflate(R.layout.expandable_list,父母,假);
}
ExpandableHeightListView的childList =(ExpandableHeightListView)view.findViewById(R.id.childList);
childList.setAdapter(新CustomAdapter(上下文,items.get(childPosition).getSubMenuItems()));
childList.invalidate();
parent.invalidate();
最后ExpandableHeightListView列表=的childList;
childList.setOnGroupExpandListener(新ExpandableListView.OnGroupExpandListener(){
INT previousItem = -1;
@覆盖
公共无效onGroupExpand(INT groupPosition){
ArrayList的< eMenuItem> tempItems = items.get(childPosition).getSubMenuItems();
如果(tempItems.get(groupPosition).getSubMenuItems()。大小()== 0){
Toast.makeText(背景下,开始活动,Toast.LENGTH_SHORT).show();
} 其他 {
Toast.makeText(上下文中,点击+ tempItems.get(groupPosition).getName(),Toast.LENGTH_SHORT).show();
}
如果(groupPosition!= previousItem)
list.collapseGroup(previousItem);
previousItem = groupPosition;
list.invalidate();
parent.invalidate();
}
});
返回查看;
}
}
通过帮助下的贾里德挖洞 - <一个href="http://stackoverflow.com/questions/15444375/how-to-create-interface-between-fragment-and-adapter/27716730?noredirect=1#comment46426845_27716730">How创建片段和适配器之间的接口?
加几件事情,我CustomAdapter和FragmentActivity
公共类CustomAdapter实现ExpandableListAdapter {
公共CustomAdapter(MainActivity fragmentactivity)
{
尝试
{
this.mAdapterCallback =((AdapterCallback)fragmentactivity);
}
赶上(ClassCastException异常E)
{
抛出新的ClassCastException异常(片段必须实现AdapterCallback。);
}
}
公共静态接口AdapterCallback
{
无效onMethodCallback();
}
@覆盖
公共查看getGroupView(INT位置,布尔isExpanded,查看convertView,ViewGroup中父){
如果(convertView == NULL){
convertView = inflater.inflate(R.layout.menu_item,父母,假);
}
TextView的文字=(TextView的)convertView.findViewById(android.R.id.text1);
text.setText(items.get(位置).getName());
ImageView的ImageView的=(ImageView的)convertView.findViewById(R.id.imageIndicator);
如果(items.get(位置).isHasChild()&安培;&安培; items.get(位置).getSubMenuItems()的大小()大于0)
imageView.setVisibility(View.VISIBLE);
其他
imageView.setVisibility(View.INVISIBLE);
如果(isExpanded)
imageView.setImageResource(R.drawable.down);
其他
imageView.setImageResource(R.drawable.next);
返回convertView;
}
@覆盖
公共查看getChildView(最终诠释childPosition,诠释groupPosition,布尔isExpanded,查看convertView,最终的ViewGroup父){
查看查看= convertView;
如果(查看== NULL){
鉴于= inflater.inflate(R.layout.expandable_list,父母,假);
}
ExpandableHeightListView的childList =(ExpandableHeightListView)view.findViewById(R.id.childList);
childList.setAdapter(新CustomAdapter(上下文,items.get(childPosition).getSubMenuItems()));
childList.invalidate();
parent.invalidate();
最后ExpandableHeightListView列表=的childList;
childList.setOnGroupExpandListener(新ExpandableListView.OnGroupExpandListener(){
INT previousItem = -1;
@覆盖
公共无效onGroupExpand(INT groupPosition){
ArrayList的&LT; eMenuItem&GT; tempItems = items.get(childPosition).getSubMenuItems();
如果(tempItems.get(groupPosition).getSubMenuItems()。大小()== 0){
Log.e(价值,位置+ childPosition);
Log.e(价值,位置+ groupPosition);
Log.e(价值,位置+ tempItems.get(groupPosition).getName());
mAdapterCallback.onMethodCallback();
} 其他 {
Toast.makeText(上下文中,点击+ tempItems.get(groupPosition).getName(),Toast.LENGTH_SHORT).show();
}
如果(groupPosition!= previousItem)
list.collapseGroup(previousItem);
previousItem = groupPosition;
list.invalidate();
parent.invalidate();
}
});
返回查看;
}
}
在我的主要活动:
公共类MainActivity扩展FragmentActivity实现AdapterCallback
{
@覆盖
保护无效的onCreate(包savedInstanceState)
{
this.mMyAdapter =新CustomAdapter(本);
}
和加入这个以外的onCreate:
公共无效onMethodCallback()
{
Log.e(呼叫,价值);
}
}
但我得到了NPE错误仍然..这是奇怪的,当我不使用回调,我没有得到NPE但是当我使用的回调我得到NPE:的 http://pastebin.com/wc2ByiFz
公共类CustomAdapter实现ExpandableListAdapter {
活动yourActivity
公共CustomAdapter(活动yourActivity)
{
this.yourActivity = yourActivity;
}
@覆盖
公共查看getGroupView(INT位置,布尔isExpanded,查看convertView,ViewGroup中父){
如果(convertView == NULL){
convertView = inflater.inflate(R.layout.menu_item,父母,假);
}
TextView的文字=(TextView的)convertView.findViewById(android.R.id.text1);
text.setText(items.get(位置).getName());
ImageView的ImageView的=(ImageView的)convertView.findViewById(R.id.imageIndicator);
如果(items.get(位置).isHasChild()&安培;&安培; items.get(位置).getSubMenuItems()的大小()大于0)
imageView.setVisibility(View.VISIBLE);
其他
imageView.setVisibility(View.INVISIBLE);
如果(isExpanded)
imageView.setImageResource(R.drawable.down);
其他
imageView.setImageResource(R.drawable.next);
返回convertView;
}
@覆盖
公共查看getChildView(最终诠释childPosition,诠释groupPosition,布尔isExpanded,查看convertView,最终的ViewGroup父){
查看查看= convertView;
如果(查看== NULL){
鉴于= inflater.inflate(R.layout.expandable_list,父母,假);
}
ExpandableHeightListView的childList =(ExpandableHeightListView)view.findViewById(R.id.childList);
childList.setAdapter(新CustomAdapter(上下文,items.get(childPosition).getSubMenuItems()));
childList.invalidate();
parent.invalidate();
最后ExpandableHeightListView列表=的childList;
childList.setOnGroupExpandListener(新ExpandableListView.OnGroupExpandListener(){
INT previousItem = -1;
@覆盖
公共无效onGroupExpand(INT groupPosition){
ArrayList的&LT; eMenuItem&GT; tempItems = items.get(childPosition).getSubMenuItems();
如果(tempItems.get(groupPosition).getSubMenuItems()。大小()== 0){
yourActivity.onYourClick(groupPosition);
} 其他 {
Toast.makeText(上下文中,点击+ tempItems.get(groupPosition).getName(),Toast.LENGTH_SHORT).show();
}
如果(groupPosition!= previousItem)
list.collapseGroup(previousItem);
previousItem = groupPosition;
list.invalidate();
parent.invalidate();
}
});
返回查看;
}
}
//你的片段
公共类yourActivity扩展FragmentActivity {
公共无效onYourClick(INT groupPosition){
}
I have customized expandable list view showing in Navigation Drawer. I have a click listener in Adapter I would like to send click event from adapter to my activity or fragment.
Is this possible if so how do I go about doing it?
Here is a snippet of my adapter:
public class CustomAdapter implements ExpandableListAdapter {
@Override
public View getGroupView(int position, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.menu_item, parent, false);
}
TextView text = (TextView) convertView.findViewById(android.R.id.text1);
text.setText(items.get(position).getName());
ImageView imageView = (ImageView) convertView.findViewById(R.id.imageIndicator);
if (items.get(position).isHasChild() && items.get(position).getSubMenuItems().size() > 0)
imageView.setVisibility(View.VISIBLE);
else
imageView.setVisibility(View.INVISIBLE);
if (isExpanded)
imageView.setImageResource(R.drawable.down);
else
imageView.setImageResource(R.drawable.next);
return convertView;
}
@Override
public View getChildView(final int childPosition, int groupPosition, boolean isExpanded, View convertView, final ViewGroup parent) {
View view = convertView;
if (view == null) {
view = inflater.inflate(R.layout.expandable_list, parent, false);
}
ExpandableHeightListView childList = (ExpandableHeightListView) view.findViewById(R.id.childList);
childList.setAdapter(new CustomAdapter(context, items.get(childPosition).getSubMenuItems()));
childList.invalidate();
parent.invalidate();
final ExpandableHeightListView list = childList;
childList.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
int previousItem = -1;
@Override
public void onGroupExpand(int groupPosition) {
ArrayList<eMenuItem> tempItems = items.get(childPosition).getSubMenuItems();
if (tempItems.get(groupPosition).getSubMenuItems().size() == 0) {
Toast.makeText(context, "Start Activity", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Clicked on " + tempItems.get(groupPosition).getName(), Toast.LENGTH_SHORT).show();
}
if (groupPosition != previousItem)
list.collapseGroup(previousItem);
previousItem = groupPosition;
list.invalidate();
parent.invalidate();
}
});
return view;
}
}
WITH HELP FROM Jared Burrows - How to create interface between Fragment and adapter?
Added few things to my CustomAdapter and FragmentActivity
public class CustomAdapter implements ExpandableListAdapter {
public CustomAdapter(MainActivity fragmentactivity)
{
try
{
this.mAdapterCallback = ((AdapterCallback) fragmentactivity);
}
catch (ClassCastException e)
{
throw new ClassCastException("Fragment must implement AdapterCallback.");
}
}
public static interface AdapterCallback
{
void onMethodCallback();
}
@Override
public View getGroupView(int position, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.menu_item, parent, false);
}
TextView text = (TextView) convertView.findViewById(android.R.id.text1);
text.setText(items.get(position).getName());
ImageView imageView = (ImageView) convertView.findViewById(R.id.imageIndicator);
if (items.get(position).isHasChild() && items.get(position).getSubMenuItems().size() > 0)
imageView.setVisibility(View.VISIBLE);
else
imageView.setVisibility(View.INVISIBLE);
if (isExpanded)
imageView.setImageResource(R.drawable.down);
else
imageView.setImageResource(R.drawable.next);
return convertView;
}
@Override
public View getChildView(final int childPosition, int groupPosition, boolean isExpanded, View convertView, final ViewGroup parent) {
View view = convertView;
if (view == null) {
view = inflater.inflate(R.layout.expandable_list, parent, false);
}
ExpandableHeightListView childList = (ExpandableHeightListView) view.findViewById(R.id.childList);
childList.setAdapter(new CustomAdapter(context, items.get(childPosition).getSubMenuItems()));
childList.invalidate();
parent.invalidate();
final ExpandableHeightListView list = childList;
childList.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
int previousItem = -1;
@Override
public void onGroupExpand(int groupPosition) {
ArrayList<eMenuItem> tempItems = items.get(childPosition).getSubMenuItems();
if (tempItems.get(groupPosition).getSubMenuItems().size() == 0) {
Log.e("value","position"+childPosition);
Log.e("value","position"+groupPosition);
Log.e("value","position"+tempItems.get(groupPosition).getName());
mAdapterCallback.onMethodCallback();
} else {
Toast.makeText(context, "Clicked on " + tempItems.get(groupPosition).getName(), Toast.LENGTH_SHORT).show();
}
if (groupPosition != previousItem)
list.collapseGroup(previousItem);
previousItem = groupPosition;
list.invalidate();
parent.invalidate();
}
});
return view;
}
}
AND IN MY MAIN ACTIVITY:
public class MainActivity extends FragmentActivity implements AdapterCallback
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
this.mMyAdapter = new CustomAdapter(this);
}
And then added this outside Oncreate:
public void onMethodCallback()
{
Log.e("Call","VALUE");
}
}
but I am getting the NPE Error still.. This is strange when I don't use the callback I am not getting NPE but when I use the callback I am getting NPE: http://pastebin.com/wc2ByiFz
public class CustomAdapter implements ExpandableListAdapter {
Activity yourActivity
public CustomAdapter(Activity yourActivity)
{
this.yourActivity= yourActivity;
}
@Override
public View getGroupView(int position, boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.menu_item, parent, false);
}
TextView text = (TextView) convertView.findViewById(android.R.id.text1);
text.setText(items.get(position).getName());
ImageView imageView = (ImageView) convertView.findViewById(R.id.imageIndicator);
if (items.get(position).isHasChild() && items.get(position).getSubMenuItems().size() > 0)
imageView.setVisibility(View.VISIBLE);
else
imageView.setVisibility(View.INVISIBLE);
if (isExpanded)
imageView.setImageResource(R.drawable.down);
else
imageView.setImageResource(R.drawable.next);
return convertView;
}
@Override
public View getChildView(final int childPosition, int groupPosition, boolean isExpanded, View convertView, final ViewGroup parent) {
View view = convertView;
if (view == null) {
view = inflater.inflate(R.layout.expandable_list, parent, false);
}
ExpandableHeightListView childList = (ExpandableHeightListView) view.findViewById(R.id.childList);
childList.setAdapter(new CustomAdapter(context, items.get(childPosition).getSubMenuItems()));
childList.invalidate();
parent.invalidate();
final ExpandableHeightListView list = childList;
childList.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
int previousItem = -1;
@Override
public void onGroupExpand(int groupPosition) {
ArrayList<eMenuItem> tempItems = items.get(childPosition).getSubMenuItems();
if (tempItems.get(groupPosition).getSubMenuItems().size() == 0) {
yourActivity.onYourClick(groupPosition);
} else {
Toast.makeText(context, "Clicked on " + tempItems.get(groupPosition).getName(), Toast.LENGTH_SHORT).show();
}
if (groupPosition != previousItem)
list.collapseGroup(previousItem);
previousItem = groupPosition;
list.invalidate();
parent.invalidate();
}
});
return view;
}
}
//Your Fragment
public class yourActivity extends FragmentActivity{
public void onYourClick(int groupPosition){
}
这篇关于点击事件从适配器到Android的活动或片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!