【问题标题】:Click event from Adapter to Activity or Fragment in Android从适配器单击事件到 Android 中的 Activity 或 Fragment
【发布时间】:2015-05-19 12:21:21
【问题描述】:

我已经自定义了在导航抽屉中显示的可扩展列表视图。我在适配器中有一个点击监听器我想将点击事件从适配器发送到我的活动或片段。

如果可以,我该怎么做?

这是我的适配器的 sn-p:

公共类 CustomAdapter 实现 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;
    }
}

Jared Burrows 的帮助下 - How to create interface between Fragment and adapter?

在我的 CustomAdapter 和 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;
    }
}

在我的主要活动中:

public class MainActivity extends FragmentActivity implements AdapterCallback
{
 @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    this.mMyAdapter = new CustomAdapter(this);
   }

然后在 Oncreate 之外添加这个:

public void onMethodCallback() 
{
        Log.e("Call","VALUE");
 }
 }

但我仍然收到 NPE 错误。这很奇怪,当我不使用回调时,我没有得到 NPE,但是当我使用回调时,我得到 NPE:http://pastebin.com/wc2ByiFz

【问题讨论】:

  • 你的适配器是单独的类吗?
  • 等我写解决方案
  • 只需让适配器成为片段或活动的内部类
  • 现在你更新了这个问题,at com.ylg.link.CustomAdapter$1.onGroupExpand(CustomAdapter.java:149)在哪里?
  • 正是我在三个日志之后回调的地方。

标签: android android-fragments android-activity android-adapter android-adapterview


【解决方案1】:
   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){
            }

【讨论】:

  • @Ammar aly:你能给我举个例子吗?请问 onYourClick 和参数是什么意思?
  • Onyourclick 是您将在片段或活动中作为回调调用的方法
  • 如何将片段与适配器链接?
  • 它给出错误 onYourClick(int) 方法未定义为 Activity 类型?
  • 你有什么活动在里面做一个方法
猜你喜欢
  • 2013-08-27
  • 2018-06-06
  • 2012-11-27
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多