Webサービスからデータを取得するActivity
があります。このデータは、ArrayAdapterを介してListView
に表示されます。この配列は、RelativeLayout
を3つのTextViews
で膨らませますが、特別なことは何もありません。
ここで、ユーザーがListView内のアイテムをクリックしたときに呼び出される、Details Activity
を実装したいと思います。簡単に聞こえますが、onItemClickListenerをArrayAdapterで動作させることはできません。
これは私のメインのActivity
です:
public class Schema extends Activity {
private ArrayList<Lesson> lessons = new ArrayList<Lesson>();
private static final String TAG = "Schema";
ListView lstLessons;
Integer lessonId;
// called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// can we use the custom titlebar?
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
// set the view
setContentView(R.layout.main);
// set the title
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar);
// listview called lstLessons
lstLessons = (ListView)findViewById(R.id.lstLessons);
// load the schema
new loadSchema().execute();
// set the click listeners
lstLessons.setOnItemClickListener(selectLesson);
}// onCreate
// declare an OnItemClickListener for the AdapterArray (this doesn't work)
private OnItemClickListener selectLesson = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int i, long l) {
Log.v(TAG, "onItemClick fired!");
}
};
private class loadSchema extends AsyncTask<Void, Void, Void> {
private ProgressDialog progressDialog;
// ui calling possible
protected void onPreExecute() {
progressDialog = ProgressDialog.show(Schema.this,"", "Please wait...", true);
}
// no ui from this one
@Override
protected Void doInBackground(Void... arg0) {
// get some JSON, this works fine
}
@Override
protected void onPostExecute(Void result) {
progressDialog.dismiss();
// apply to list adapter
lstLessons.setAdapter(new LessonListAdapter(Schema.this, R.layout.list_item, lessons));
}
私のArrayAdapterコード:
// custom ArrayAdapter for Lessons
private class LessonListAdapter extends ArrayAdapter<Lesson> {
private ArrayList<Lesson> lessons;
public LessonListAdapter(Context context, int textViewResourceId, ArrayList<Lesson> items) {
super(context, textViewResourceId, items);
this.lessons = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.list_item, null);
}
Lesson o = lessons.get(position);
TextView tt = (TextView) v.findViewById(R.id.titletext);
TextView bt = (TextView) v.findViewById(R.id.timestarttext);
TextView rt = (TextView) v.findViewById(R.id.roomtext);
v.setClickable(true);
v.setFocusable(true);
tt.setText(o.title);
bt.setText(o.fmt_time_start);
rt.setText(o.room);
return v;
}
}// LessonListAdapter
Main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout Android:id="@+id/main"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_height="fill_parent" Android:layout_width="fill_parent"
Android:screenOrientation="portrait"
>
<!-- student name -->
<TextView
Android:id="@+id/schema_view_student"
Android:text="Name" Android:padding="4dip"
Android:layout_height="wrap_content"
Android:layout_width="fill_parent"
Android:gravity="center_vertical|center_horizontal"
style="@style/schema_view_student"
/>
<!-- date for schema -->
<TextView
Android:id="@+id/schema_view_title"
Android:layout_height="wrap_content"
Android:layout_margin="0dip"
style="@style/schema_view_day"
Android:gravity="center_vertical|center_horizontal"
Android:layout_below="@+id/schema_view_student"
Android:text="Date" Android:padding="6dip"
Android:layout_width="fill_parent"
/>
<!-- horizontal line -->
<View
Android:layout_width="fill_parent"
Android:layout_height="1dip"
Android:background="#55000000"
Android:layout_below="@+id/schema_view_title"
/>
<!-- list of lessons -->
<ListView
Android:id="@+id/lstLessons"
Android:layout_height="wrap_content"
Android:layout_width="fill_parent"
Android:layout_below="@+id/schema_view_title"
/>
</RelativeLayout>
List_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="60px"
Android:padding="12dip">
<TextView
Android:id="@+id/timestarttext"
Android:text="09:45"
style="@style/LessonTimeStartText"
Android:layout_width="60dip"
Android:layout_alignParentTop="true"
Android:layout_alignParentBottom="true"
Android:layout_height="fill_parent" Android:gravity="center_vertical|right" Android:paddingRight="6dip"/>
<TextView
Android:id="@+id/titletext"
Android:text="Test"
style="@style/LessonTitleText"
Android:layout_width="wrap_content"
Android:layout_height="fill_parent"
Android:layout_toRightOf="@+id/timestarttext"
Android:layout_alignParentTop="true"
Android:layout_alignParentBottom="true" Android:gravity="center_vertical|center_horizontal"/>
<TextView
Android:id="@+id/roomtext"
Android:text="123"
Android:layout_width="wrap_content"
Android:layout_height="fill_parent"
style="@style/LessonRoomText"
Android:layout_alignParentTop="true"
Android:layout_alignParentBottom="true"
Android:layout_alignParentRight="true"
Android:gravity="center_vertical" />
</RelativeLayout>
ここ数時間これをいじっていて、問題が何であるかについて頭を悩ませているようには見えません。私の問題は この質問 と非常によく似ていますが、ListActivityを拡張していないため、onListClickItem()をどこに配置すればよいかわかりません。
UPDATE:数日間これに戸惑いましたが、まだ問題を見つけることができません。
アクティビティを書き直す必要がありますが、今回はアクティビティではなくListActivityを拡張しますか? onItemClickメソッド自体を提供し、おそらく上書きしやすいためです。
または、ArrayAdapterの各getView()でリスナーを直接バインドする必要がありますか?私はこれを読んだことは悪い習慣だと思います(私は自分の投稿で試みて失敗したのでやるべきです)。
バグが見つかりました-それは この問題 のようです。各list_item.xml要素にAndroid:focusable="false"
を追加すると問題が解決し、onclickが元のコードでトリガーされるようになりました。
同じ問題が発生し、修正を試みましたが、機能させることができませんでした。私にとってうまくいったのは、あなたの場合、アイテムレイアウトxml
、_Android:descendantFocusability="blocksDescendants"
_から_<RelativeLayout>
_に_list_item.xml
_を追加することでした。これにより、onItemClick()
を呼び出すことができます。
私のために働いたこと:
1)Android:descendantFocusability = "blocksDescendants"を相対レイアウトタグに追加します。結果を以下に示します。
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:descendantFocusability="blocksDescendants" >
2)list_item.xmlの例のすべての要素にAndroid:focusable = "false"を追加します:
<TextView
Android:id="@+id/textView2"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="TextView"
Android:focusable="false" />
かつて私は同様の問題を抱えていました。すべてのリストアイテムにはテキストビューとチェックボックスがあり、チェックボックスがあるという理由だけで、リストアイテム全体がイベントを発生させるために 'enabled'ではありませんでした。ビューを取得しているときに、アダプター内で少しトリックを作成して解決しました。
私が置いたビューを返す直前:
v.setOnClickListener(listener);
(オブジェクトlistener
は私がonItemClickListener
のコンストラクターに与えたAdapter
です)。
しかし、私はあなたに言わなければなりません、問題はプラットフォームのためです、それはバグです。
私は同じ問題を抱えていて、追加して解決しようとしました
Android:focusableInTouchMode="false"
Android:clickable="false"
Android:focusable="false"
item.xmlに追加しましたが、それでも機能しません!!!実際、私は魔女が含む相対的なレイアウトの問題を見つけました
Android:focusableInTouchMode="true" Android:focusable="true"
そして私がそれを削除したときすべてのものは大丈夫です
protected void onPostExecute(Void result) {
progressDialog.dismiss(); stLessons.setAdapter(new LessonListAdapter(Schema.this, R.layout.list_item, lessons));
//add this
ListView lv = getListView(); lv.setOnItemClickListener(new ListView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> a, View v, int i, long l) {
//do stuff
}
});
}