在列表视图中单击 ImageButton 时如何打开新的 activity?
How Can I open a new activity when an ImageButton is clicked on in the listview?
如何在列表视图中单击 ImageButton 时打开一个新的 activity?目前我的 OnClickListener 在我的 ArrayAdapter class 中,但我无法从那里开始一个新的 activity。那么如何在我的 MainActivity 中获取 OnClickListener 以及如何处理 "name" 和 "ID"?
这是我的 ArrayAdapter:
public class MessageArrayAdapter extends ArrayAdapter<MessageHome> {
private TextView playername;
private ImageView profile;
private ImageButton chat;
private List<MessageHome> MessageList = new ArrayList<MessageHome>();
private LinearLayout singleMessageContainer;
@Override
public void add(MessageHome object) {
MessageList.add(object);
super.add(object);
}
public MessageArrayAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
public int getCount() {
return this.MessageList.size();
}
public MessageHome getItem(int index) {
return this.MessageList.get(index);
}
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.activity_chat_singlemessage, parent, false);
}
singleMessageContainer = (LinearLayout) row.findViewById(R.id.singleMessageContainer);
MessageHome chatMessageObj = getItem(position);
playername = (TextView) row.findViewById(R.id.playername_);
playername.setText(chatMessageObj.name);
final String ID = chatMessageObj.ID;
final String name = chatMessageObj.name;
profile = (ImageView) row.findViewById(R.id.imageView2);
if(chatMessageObj.newm == 1)
profile.setImageResource(R.drawable.player);
else
profile.setImageResource(R.drawable.player2);
chat = (ImageButton) row.findViewById(R.id.ib_message);
chat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("log_tag",name+ID);
// Here start new activity, but doesn't work here
}
});
return row;
}
}
这是我的 MainActivity:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent i = getIntent();
setContentView(R.layout.activity_message);
listView = (ListView) findViewById(R.id.listView1);
messageArrayAdapter = new MessageArrayAdapter(getApplicationContext(), R.layout.activity_message_single);
listView.setAdapter(messageArrayAdapter);
listView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
listView.setAdapter(messageArrayAdapter);
//to scroll the list view to bottom on data change
messageArrayAdapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged();
listView.setSelection(messageArrayAdapter.getCount() - 1);
}
});
}
感谢您的帮助 ;)
所有 Views
都有一个 Context
:
chat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("log_tag",name+ID);
Intent intent = new Intent(v.getContext(), NextActivity.class);
v.getContext().startActivity(intent);
}
});
在适配器中:
private Context context;
public MessageArrayAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
this.context = context;
}
并在您的听众中:
context.startActivity(new Intent(context,YourNewActivity.class));
尝试将以下行放入您的 activity_chat_singlemessage.xml
android:onClick="nameOfFunction"
并将此函数放入您的 activity
public void nameOfFunction(final View view){
startActivity(new Intent(this, YourNewActivity.class));
}
我认为你有一些问题。但首先,您的适配器中只有一个图像按钮实例。因此,我认为只有列表中的最后一项才会绑定图像按钮。
您应该为列表中的每个项目创建一个视图持有者,因为您需要将事件绑定到列表中的每个项目,以存储项目的索引以及该视图持有者。所以创建一个内部 class(我删除了你的一些细节):
public static class ViewHolder{
public TextView playerName;
public ImageButton profileButton;
}
在您的适配器中,getView 属性 处理 viewHolder:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder row;
if (convert View == null) {
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.activity_chat_singlemessage, parent, false);
row.playerName = (TextView) row.findViewById(R.id.playername_);
row.profileButton = (ImageButton) row.findViewById(R.id.ib_message);
convertView.setTag(row);
} else row = (ViewHolder) convertView.GetTag();
row.setText(chatMessageObj.name);
row.profileButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("log_tag",name+ID);
Intent intent = new Intent(v.getContext(), NextActivity.class);
v.getContext().startActivity(intent);
}
});
希望足以让你继续前进。 (从 asadmshah 复制了意图代码)
如何在列表视图中单击 ImageButton 时打开一个新的 activity?目前我的 OnClickListener 在我的 ArrayAdapter class 中,但我无法从那里开始一个新的 activity。那么如何在我的 MainActivity 中获取 OnClickListener 以及如何处理 "name" 和 "ID"?
这是我的 ArrayAdapter:
public class MessageArrayAdapter extends ArrayAdapter<MessageHome> {
private TextView playername;
private ImageView profile;
private ImageButton chat;
private List<MessageHome> MessageList = new ArrayList<MessageHome>();
private LinearLayout singleMessageContainer;
@Override
public void add(MessageHome object) {
MessageList.add(object);
super.add(object);
}
public MessageArrayAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
public int getCount() {
return this.MessageList.size();
}
public MessageHome getItem(int index) {
return this.MessageList.get(index);
}
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.activity_chat_singlemessage, parent, false);
}
singleMessageContainer = (LinearLayout) row.findViewById(R.id.singleMessageContainer);
MessageHome chatMessageObj = getItem(position);
playername = (TextView) row.findViewById(R.id.playername_);
playername.setText(chatMessageObj.name);
final String ID = chatMessageObj.ID;
final String name = chatMessageObj.name;
profile = (ImageView) row.findViewById(R.id.imageView2);
if(chatMessageObj.newm == 1)
profile.setImageResource(R.drawable.player);
else
profile.setImageResource(R.drawable.player2);
chat = (ImageButton) row.findViewById(R.id.ib_message);
chat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("log_tag",name+ID);
// Here start new activity, but doesn't work here
}
});
return row;
}
}
这是我的 MainActivity:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent i = getIntent();
setContentView(R.layout.activity_message);
listView = (ListView) findViewById(R.id.listView1);
messageArrayAdapter = new MessageArrayAdapter(getApplicationContext(), R.layout.activity_message_single);
listView.setAdapter(messageArrayAdapter);
listView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
listView.setAdapter(messageArrayAdapter);
//to scroll the list view to bottom on data change
messageArrayAdapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged();
listView.setSelection(messageArrayAdapter.getCount() - 1);
}
});
}
感谢您的帮助 ;)
所有 Views
都有一个 Context
:
chat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("log_tag",name+ID);
Intent intent = new Intent(v.getContext(), NextActivity.class);
v.getContext().startActivity(intent);
}
});
在适配器中:
private Context context;
public MessageArrayAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
this.context = context;
}
并在您的听众中:
context.startActivity(new Intent(context,YourNewActivity.class));
尝试将以下行放入您的 activity_chat_singlemessage.xml
android:onClick="nameOfFunction"
并将此函数放入您的 activity
public void nameOfFunction(final View view){
startActivity(new Intent(this, YourNewActivity.class));
}
我认为你有一些问题。但首先,您的适配器中只有一个图像按钮实例。因此,我认为只有列表中的最后一项才会绑定图像按钮。 您应该为列表中的每个项目创建一个视图持有者,因为您需要将事件绑定到列表中的每个项目,以存储项目的索引以及该视图持有者。所以创建一个内部 class(我删除了你的一些细节):
public static class ViewHolder{
public TextView playerName;
public ImageButton profileButton;
}
在您的适配器中,getView 属性 处理 viewHolder:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder row;
if (convert View == null) {
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.activity_chat_singlemessage, parent, false);
row.playerName = (TextView) row.findViewById(R.id.playername_);
row.profileButton = (ImageButton) row.findViewById(R.id.ib_message);
convertView.setTag(row);
} else row = (ViewHolder) convertView.GetTag();
row.setText(chatMessageObj.name);
row.profileButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("log_tag",name+ID);
Intent intent = new Intent(v.getContext(), NextActivity.class);
v.getContext().startActivity(intent);
}
});
希望足以让你继续前进。 (从 asadmshah 复制了意图代码)