点击事件从适配器到Android的活动或片段 [英] Click event from Adapter to Activity or Fragment in Android

查看:206
本文介绍了点击事件从适配器到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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆