web-dev-qa-db-ja.com

onItemClickListenerがカスタムArrayAdapterで起動しない

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()でリスナーを直接バインドする必要がありますか?私はこれを読んだことは悪い習慣だと思います(私は自分の投稿で試みて失敗したのでやるべきです)。

21
cvaldemar

バグが見つかりました-それは この問題 のようです。各list_item.xml要素にAndroid:focusable="false"を追加すると問題が解決し、onclickが元のコードでトリガーされるようになりました。

51
cvaldemar

同じ問題が発生し、修正を試みましたが、機能させることができませんでした。私にとってうまくいったのは、あなたの場合、アイテムレイアウトxml、_Android:descendantFocusability="blocksDescendants"_から_<RelativeLayout>_に_list_item.xml_を追加することでした。これにより、onItemClick()を呼び出すことができます。

35
slybloty

私のために働いたこと:

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" />
9
newbie

かつて私は同様の問題を抱えていました。すべてのリストアイテムにはテキストビューとチェックボックスがあり、チェックボックスがあるという理由だけで、リストアイテム全体がイベントを発生させるために 'enabled'ではありませんでした。ビューを取得しているときに、アダプター内で少しトリックを作成して解決しました。

私が置いたビューを返す直前:

v.setOnClickListener(listener);

(オブジェクトlistenerは私がonItemClickListenerのコンストラクターに与えたAdapterです)。

しかし、私はあなたに言わなければなりません、問題はプラットフォームのためです、それはバグです。

私は同じ問題を抱えていて、追加して解決しようとしました

Android:focusableInTouchMode="false"
Android:clickable="false"
Android:focusable="false"

item.xmlに追加しましたが、それでも機能しません!!!実際、私は魔女が含む相対的なレイアウトの問題を見つけました

 Android:focusableInTouchMode="true" Android:focusable="true"

そして私がそれを削除したときすべてのものは大丈夫です

1
HoNzO
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
                }
            });
     }
0
Mikhaili