简体   繁体   English

如何从CustomAdapter调用Activity中的方法

[英]How to call a method in Activity from a CustomAdapter

I have an image in feed_item.xml that is inflated in the custom adapter .I am able to handle click events for the image. 我在feed_item.xml中有一个在custom adapter膨胀的image 。我能够处理该图像的单击事件。

I Have a relative layout in my activity_main that is rendered player.setVisibility(View.GONE); 我在activity_main中有一个relative layout ,该relative layout已呈现为player.setVisibility(View.GONE); when my Main Activity is launched.I would like to setVisibility(View.VISIBLE) of this layout when my image in the row is clicked. 当我的Main Activity启动时。单击行中的图像时,我想设置此布局的setVisibility(View.VISIBLE)

I have trouble relating the two layouts with my Custom Adapter and Main Activity .Any suggestions will be appreciated!! 我在将这两种布局与“ Custom Adapter和“ Main Activity相关联时遇到了麻烦。任何建议将不胜感激!

FeedListAdapter.java FeedListAdapter.java

public class FeedListAdapter extends BaseAdapter {
    private Activity activity;
    private LayoutInflater inflater;
    private List<FeedItem> feedItems;
    ImageLoader imageLoader = AppController.getInstance().getImageLoader();

    public FeedListAdapter(Activity activity, List<FeedItem> feedItems) {
        this.activity = activity;
        this.feedItems = feedItems;
    }

    @Override
    public int getCount() {
        return feedItems.size();
    }

    @Override
    public Object getItem(int location) {
        return feedItems.get(location);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (inflater == null)
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
            convertView = inflater.inflate(R.layout.feed_item, null);


        TextView name = (TextView) convertView.findViewById(R.id.name);

        FeedItem item = feedItems.get(position);

        name.setText(item.getName());
        String fontPath = "fonts/Lato-Light.ttf";

        // Loading Font Face
        Typeface tf = Typeface.createFromAsset(activity.getAssets(), fontPath);

        // Applying font
        name.setTypeface(tf);

        ImageView play=(ImageView)convertView.findViewById(R.id.play);
        play.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(activity, "Show Layout!",                        Toast.LENGTH_SHORT).show();
            }
        });
        ImageView options=(ImageView)convertView.findViewById(R.id.options_popup);
        options.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showFilterPopup(view);
            }
        });

        return convertView;
    }

    }

MainActivity.java MainActivity.java

public class MainActivity extends ActionBarActivity {

RelativeLayout player;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.app_bar);
        setSupportActionBar(toolbar);
        TextView mToolBarTextView = (TextView) findViewById(R.id.text_view_toolbar_title);
        mToolBarTextView.setText("Home");
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        listView = (InnerGridView) findViewById(R.id.list);

        feedItems = new ArrayList<FeedItem>();

        listAdapter = new FeedListAdapter(this, feedItems);
        listView.setAdapter(listAdapter);

        player = (RelativeLayout) findViewById(R.id.player);
        player.setVisibility(View.GONE);
    }
}

You can create your own interface with a method like this 您可以使用如下方法创建自己的界面

 public interface OnClickInMyAdapterListener {
    public void onItemclicked();
  }

than your activity should implement this interface and override its method 比您的活动应实现此接口并覆盖其方法

public class MainActivity extends ActionBarActivity implements OnClickInMyAdapterListener  {
   ...
   ...
}


@Override
public void onItemclicked() {
  // do what you want
}

change your adapter in order to recive the interface 更改您的适配器以获取界面

     private OnClickInMyAdapterListener  myActivityInterface;

     public FeedListAdapter(Activity activity, List<FeedItem> feedItems, OnClickInMyAdapterListener  myActivityInterface ) {
            this.activity = activity;
            this.feedItems = feedItems;
            this.myActivityInterface= myActivityInterface;

        }

in the activity pass the interface to the adapter 在活动中将接口传递给适配器

listAdapter = new FeedListAdapter(this, feedItems, (OnClickInMyAdapterListener ) this);

and use it in your adapter wherever you want 并在您想要的任何地方在适配器中使用

this.myActivityInterface.onItemclicked();

... This solution is useful also if your adapter is used in more diffrent activites ...如果您的适配器用于更多不同的活动中,此解决方案也很有用

You can write one public method in Activity 您可以在“活动”中编写一种公共方法

And cast your activity context to your Activity 并将您的活动上下文投射到您的活动

((MainActivity)activity).doSomething();

activity is context you are passing to adapter 活动是您要传递给适配器的上下文

doSomething is method in activity doSomething是活动中的方法

Rather than setting OnClickListeners on the Views within your custom Adapter, you should call: 而不是在自定义适配器内的视图上设置OnClickListeners,您应该调用:

listView.setOnItemSelectedListener(this);

And have your Activity implement AdapterView.OnItemSelectedListener 并让您的Activity实现AdapterView.OnItemSelectedListener

See http://developer.android.com/reference/android/widget/AdapterView.OnItemSelectedListener.html 参见http://developer.android.com/reference/android/widget/AdapterView.OnItemSelectedListener.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM