Java 如何从CustomAdapter调用活动中的方法
我在Java 如何从CustomAdapter调用活动中的方法,java,android,custom-adapter,Java,Android,Custom Adapter,我在feed\u item.xml中有一个图像,它在自定义适配器中膨胀。我能够处理图像的单击事件 在我的活动_main中有一个相对布局,该布局呈现为player.setVisibility(View.GONE)当我的主活动启动时。单击行中的图像时,我想设置此布局的可见性(View.VISIBLE) 我很难将这两种布局与我的自定义适配器和主要活动联系起来。如有任何建议,将不胜感激 FeedListAdapter.java public class FeedListAdapter extends B
feed\u item.xml中有一个图像
,它在自定义适配器中膨胀。我能够处理图像的单击事件
在我的活动_main
中有一个相对布局
,该布局呈现为player.setVisibility(View.GONE)代码>当我的主活动启动时
。单击行中的图像时,我想设置此布局的可见性(View.VISIBLE)
我很难将这两种布局与我的自定义适配器
和主要活动
联系起来。如有任何建议,将不胜感激
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;
}
}
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);
}
}
公共类FeedListAdapter扩展了BaseAdapter{
私人活动;
私人充气机;
私人物品清单;
ImageLoader ImageLoader=AppController.getInstance().getImageLoader();
公共FeedListAdapter(活动,列出feedItems){
这个。活动=活动;
此项。feedItems=feedItems;
}
@凌驾
public int getCount(){
返回feedItems.size();
}
@凌驾
公共对象getItem(int位置){
返回feedItems.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
如果(充气器==null)
充气器=(充气器)活动
.getSystemService(上下文布局\充气机\服务);
if(convertView==null)
convertView=充气机。充气(R.layout.feed_项,空);
TextView name=(TextView)convertView.findViewById(R.id.name);
FeedItem=feedItems.get(位置);
name.setText(item.getName());
字符串fontPath=“font/Lato Light.ttf”;
//加载字体
Typeface tf=Typeface.createFromAsset(activity.getAssets(),fontPath);
//应用字体
名称.设置字体(tf);
ImageView播放=(ImageView)convertView.findViewById(R.id.play);
play.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Toast.makeText(活动,“显示布局!”,Toast.LENGTH_SHORT.Show();
}
});
ImageView选项=(ImageView)convertView.findViewById(R.id.options\u弹出窗口);
options.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
showFilterPopup(视图);
}
});
返回视图;
}
}
MainActivity.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;
}
}
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);
}
}
公共类MainActivity扩展了ActionBarActivity{
相对年轻球员;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.app_bar);
设置支持操作栏(工具栏);
TextView mtoolbertextview=(TextView)findViewById(R.id.text\u视图\u工具栏\u标题);
mtoolbertextview.setText(“主页”);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
listView=(InnerGridView)findViewById(R.id.list);
feedItems=新的ArrayList();
listAdapter=新的FeedListAdapter(此为feedItems);
setAdapter(listAdapter);
player=(RelativeLayout)findViewById(R.id.player);
player.setVisibility(View.GONE);
}
}
您不应该在自定义适配器的视图上设置OnClickListeners,而应该调用:
listView.setOnItemSelectedListener(this);
并让您的活动实现AdapterView.OnItemSelectedListener
请参见,不要在自定义适配器的视图上设置OnClickListeners,而应调用:
listView.setOnItemSelectedListener(this);
并让您的活动实现AdapterView.OnItemSelectedListener
请参见您可以在活动中编写一个公共方法
并将您的活动上下文投射到您的活动中
((MainActivity)activity).doSomething();
活动是要传递给适配器的上下文
doSomething是活动中的方法您可以在活动中编写一个公共方法
并将您的活动上下文投射到您的活动中
((MainActivity)activity).doSomething();
活动是要传递给适配器的上下文
doSomething是活动中的方法您可以使用这样的方法创建自己的接口
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;
}
并在适配器中随时随地使用它
this.myActivityInterface.onItemclicked();
。。。如果您的适配器用于更多不同的活动中,此解决方案也很有用,您可以使用以下方法创建自己的接口
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;
}
并在适配器中随时随地使用它
this.myActivityInterface.onItemclicked();
。。。如果您的适配器用于更多不同的活动,此解决方案也很有用您可以使用接口,在映像中单击调用该接口并将您的主要活动实现到该接口我可以实现多个接口吗?您可以使用接口,在映像中单击调用该接口并将您的主要活动实现到该接口我可以吗实现多个接口?感谢您的建议,但我正在避免listview的单击事件。您的方法的问题是,适配器将记不起与您交互的视图行。ListView及其同类产品不断循环使用它们的视图,以降低内存使用率。如果您依赖onClickListener来记住设置它的行,那么您不应该记住,因为它不会记住。例如,如果我想在单击图像时显示该行标题的祝酒词…(请查看代码)