以下は、リストビューを作成するテストコードです。リストビューは正常に表示されますが、クリックイベントにエラーがあります。ハードコードメッセージを新しいアクティビティに送信するインテントを作成したいと思います。ただし、ラインのエラーが表示されます
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);
}
});
}
どこで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);
ListViewには、アイテムクリックリスナーコールバックがあります。 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);
}
});
最初に、クラスはクリックリスナを実装する必要があります:
implements OnItemClickListener
次に、ListViewにリスナーを設定します
yourList.setOnItemclickListener(this);
最後に、clicメソッドを作成します。
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(MainActivity.this, "You Clicked at ",
Toast.LENGTH_SHORT).show();
}
あなたが言ったように、このステートメントからコードにエラーが来ています
Intent intent = new Intent(context, SendMessage.class);
これは、InItemコンストラクタにInItemコンストラクタにOnItemClickListener匿名クラスのコンテキストを提供しているためです。
Android.content.Intent.Intent(Context packageContext, Class<?> cls)
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);
}
});
これがあなたを助けるかどうか私に知らせてください
編集:-リストの値を取得するための問題を見つけている場合は、配列リストを明確にしないでください。
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メソッドです。
//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
私のテストによると、
onItemClickListenerを実装します->動作します。
setOnItemClickListener->動作します。
ListViewはデフォルトでクリック可能です(API 19)
重要なことは、「クリック」はTextViewに対してのみ機能することです(アイテムとしてsimple_list_item_1.xmlを選択した場合)。つまり、ListViewにテキストデータを提供する場合、テキスト領域をクリックすると「クリック」が機能します。空の領域をクリックしても、「クリックイベント」はトリガーされません。