如何从 CustomAdapter 调用 Activity 中的方法

How to call a method in Activity from a CustomAdapter

我在 feed_item.xml 中有一个 imagecustom adapter 中膨胀。我能够处理图像的点击事件。

我的 activity_main 中有一个 relative layout 当我的 Main Activity 是 launched.I 时呈现 player.setVisibility(View.GONE); 想要 setVisibility(View.VISIBLE)单击行中我的图像时的此布局。

我无法将这两个布局与我的 Custom AdapterMain Activity 相关联。任何建议将不胜感激!

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

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);
    }
}

与其在自定义适配器中的视图上设置 OnClickListeners,不如调用:

listView.setOnItemSelectedListener(this);

让你的Activity实施AdapterView.OnItemSelectedListener

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

你可以在Activity

中写一个public方法

并将您的 activity 上下文投射到您的 Activity

((MainActivity)activity).doSomething();

activity 是您传递给适配器的上下文

doSomething 是 activity

中的方法

您可以使用这样的方法创建自己的界面

 public interface OnClickInMyAdapterListener {
    public void onItemclicked();
  }

你的 activity 应该实现这个接口并覆盖它的方法

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


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

更改适配器以接收接口

     private OnClickInMyAdapterListener  myActivityInterface;

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

        }

在activity中将接口传递给适配器

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

并在您的适配器中随心所欲地使用它

this.myActivityInterface.onItemclicked();

...如果您的适配器用于更多不同的活动,此解决方案也很有用