以下是我的测试代码,用于创建列表视图,列表视图显示成功,但是,点击事件中存在错误。我想创建一个向新活动发送硬编码消息的意图。但是,它显示行
的错误Intent intent = new Intent(context, SendMessage.class);
所以,问题是,我应该为这个课提供什么?
另外,输出消息代替硬编码,如何捕获列表视图行中的数据并传递给新活动?例如第一行BBB,AAA,R.drawable.tab1_hdpi
。
感谢。
public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "com.example.ListViewTest.MESSAGE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<ListEntry> members = new ArrayList<ListEntry>();
members.add(new ListEntry("BBB","AAA",R.drawable.tab1_hdpi));
members.add(new ListEntry("ccc","ddd",R.drawable.tab2_hdpi));
members.add(new ListEntry("assa","cxv",R.drawable.tab3_hdpi));
members.add(new ListEntry("BcxsadvBB","AcxdxvAA"));
members.add(new ListEntry("BcxvadsBB","AcxzvAA"));
members.add(new ListEntry("BcxvBB","AcxvAA"));
members.add(new ListEntry("BvBB","AcxsvAA"));
members.add(new ListEntry("BcxvBB","AcxsvzAA"));
members.add(new ListEntry("Bcxadv","AcsxvAA"));
members.add(new ListEntry("BcxcxB","AcxsvAA"));
ListView lv = (ListView)findViewById(R.id.listView1);
Log.i("testTag","before start adapter");
StringArrayAdapter ad = new StringArrayAdapter (members,this);
Log.i("testTag","after start adapter");
Log.i("testTag","set adapter");
lv.setAdapter(ad);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Intent intent = new Intent(context, SendMessage.class);
String message = "abc";
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
});
}
答案 0 :(得分:93)
我看不出你在哪里声明context
。出于创建意图的目的,您可以使用MainActivity.this
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Intent intent = new Intent(MainActivity.this, SendMessage.class);
String message = "abc";
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
});
要在点击后检索对象,可以使用AdapterView
:
ListEntry entry = (ListEntry) parent.getItemAtPosition(position);
答案 1 :(得分:13)
ListView具有Item click侦听器回调。您应该在onItemClickListener
中设置ListView
。回调包含AdapterView
和position
作为参数。哪个可以给你ListEntry
。
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
ListEntry entry= (ListEntry) parent.getAdapter().getItem(position);
Intent intent = new Intent(MainActivity.this, SendMessage.class);
String message = entry.getMessage();
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
});
答案 2 :(得分:6)
正如您所说的
,您的代码中出现了错误Intent intent = new Intent(context, SendMessage.class);
这是因为您将OnItemClickListener匿名类的上下文提供给Intent构造函数但是根据Intent的构造函数
android.content.Intent.Intent(Context packageContext, Class<?> cls)
您必须提供您使用intent的活动的上下文,即MainActivity类上下文。所以给出错误的陈述将转换为
Intent intent = new Intent(MainActivity.this, SendMessage.class);
另外,要将此消息从此MainActivity发送到SendMessage类,请参阅下面的代码
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
ListEntry entry= (ListEntry) parent.getAdapter().getItem(position);
Intent intent = new Intent(MainActivity.this, SendMessage.class);
intent.putExtra(EXTRA_MESSAGE, entry.getMessage());
startActivity(intent);
}
});
如果这对你有帮助,请告诉我
修改: - 强> 如果你发现了一些问题来获取list的值,那么就有一件事会解析你的数组列表
ArrayList<ListEntry> members = new ArrayList<ListEntry>();
全局,即在创建和更改您的监听器之前,如下所示
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Intent intent = new Intent(MainActivity.this, SendMessage.class);
intent.putExtra(EXTRA_MESSAGE, members.get(position));
startActivity(intent);
}
});
所以你的整个代码看起来像
public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "com.example.ListViewTest.MESSAGE";
ArrayList<ListEntry> members = new ArrayList<ListEntry>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
members.add(new ListEntry("BBB","AAA",R.drawable.tab1_hdpi));
members.add(new ListEntry("ccc","ddd",R.drawable.tab2_hdpi));
members.add(new ListEntry("assa","cxv",R.drawable.tab3_hdpi));
members.add(new ListEntry("BcxsadvBB","AcxdxvAA"));
members.add(new ListEntry("BcxvadsBB","AcxzvAA"));
members.add(new ListEntry("BcxvBB","AcxvAA"));
members.add(new ListEntry("BvBB","AcxsvAA"));
members.add(new ListEntry("BcxvBB","AcxsvzAA"));
members.add(new ListEntry("Bcxadv","AcsxvAA"));
members.add(new ListEntry("BcxcxB","AcxsvAA"));
ListView lv = (ListView)findViewById(R.id.listView1);
Log.i("testTag","before start adapter");
StringArrayAdapter ad = new StringArrayAdapter (members,this);
Log.i("testTag","after start adapter");
Log.i("testTag","set adapter");
lv.setAdapter(ad);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Intent intent = new Intent(MainActivity.this, SendMessage.class);
intent.putExtra(EXTRA_MESSAGE, members.get(position).getMessage());
startActivity(intent);
}
});
}
其中getMessage()将是您在ListEntry类中指定的getter方法,用于获取先前设置的消息。
答案 3 :(得分:6)
首先,该类必须实现点击侦听器:
implements OnItemClickListener
然后将侦听器设置为ListView
yourList.setOnItemclickListener(this);
最后,创建click方法:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(MainActivity.this, "You Clicked at ",
Toast.LENGTH_SHORT).show();
}
答案 4 :(得分:2)
//get main activity
final Activity main_activity=getActivity();
//list view click listener
final ListView listView = (ListView) inflatedView.findViewById(R.id.listView_id);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String stringText;
//in normal case
stringText= ((TextView)view).getText().toString();
//in case if listview has separate item layout
TextView textview=(TextView)view.findViewById(R.id.textview_id_of_listview_Item);
stringText=textview.getText().toString();
//show selected
Toast.makeText(main_activity, stringText, Toast.LENGTH_LONG).show();
}
});
//populate listview
答案 5 :(得分:2)
根据我的测试,
实现OnItemClickListener - &gt;作品。
setOnItemClickListener - &gt;作品。
默认情况下,ListView是可点击的(API 19)
重要的是,“click”仅适用于TextView(如果选择simple_list_item_1.xml作为项目)。这意味着如果您为ListView提供文本数据,单击文本区域时“单击”将起作用。点击空白区域不会触发“点击事件”。