当前位置: 代码迷 >> java >> 如何从CustomAdapter调用Activity中的方法
  详细解决方案

如何从CustomAdapter调用Activity中的方法

热度:22   发布时间:2023-07-25 19:33:23.0

我在feed_item.xml中有一个在custom adapter膨胀的image 。我能够处理该图像的单击事件。

我在activity_main中有一个relative layout ,该relative layout已呈现为player.setVisibility(View.GONE); 当我的Main Activity启动时。单击行中的图像时,我想设置此布局的setVisibility(View.VISIBLE)

我在将这两种布局与“ Custom Adapter和“ Main 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);
    }
}

您可以使用如下方法创建自己的界面

 public interface OnClickInMyAdapterListener {
    public void onItemclicked();
  }

比您的活动应实现此接口并覆盖其方法

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;

        }

在活动中将接口传递给适配器

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

并在您想要的任何地方在适配器中使用

this.myActivityInterface.onItemclicked();

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

您可以在“活动”中编写一种公共方法

并将您的活动上下文投射到您的活动

((MainActivity)activity).doSomething();

活动是您要传递给适配器的上下文

doSomething是活动中的方法

而不是在自定义适配器内的视图上设置OnClickListeners,您应该调用:

listView.setOnItemSelectedListener(this);

并让您的Activity实现AdapterView.OnItemSelectedListener

参见

  相关解决方案