web-dev-qa-db-ja.com

setOnItemClickListener()がカスタムListViewで機能しない@ Android

すべての行にListViewを拡張することにより、カスタムLinearLayoutを実装しました。すべての行には、小さなサムネイル、テキスト、および_check box_があります。 _list view_は適切に展開されており、問題なくスクロールして移動できます。

しかし、ListViewsetOnItemClickListener()にまったく応答しないようです。そのため、内部のテキストのgetView()にクリックリスナーを設定して回避策を見つける必要がありました。 adapterを再利用しようとすると、明らかに問題を引き起こしているすべての行。誰かが解決策を持っていますか?

19
Sameer

これを試して
ListViewの場合、

final ListView list = (ListView) findViewById(R.id.list);
list.setItemsCanFocus(false);

また、リストアイテム内のチェックボックスにフォーカス可能なfalseを設定していることを確認してください

Android:focusable="false"
Android:focusableInTouchMode="false"
45
bhatt4982

古い答え:私が書いた 前の投稿はこちら

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

imageButtonがカスタムビューにある場合は役に立ちません。実行時にbutton.setFocusable(false);を使用する必要があります(Javaソースコードから)

編集:さらに洗練されたソリューションがあります。リスト要素のルートレイアウトにAndroid:descendantFocusability="blocksDescendants"を追加してみてください。これにより、ListItemのクリックが可能になり、個別にボタンまたはImageButtonのクリックを処理できます。

11
Ewoks

アイテムビューをCheckBoxに設定するListViewの場合

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

http://code.google.com/p/Android/issues/detail?id=3414

6
Tomas

拡張アダプタクラスでViewHolderを作成しましたか?はいの場合は、setOnItemClickListener()でそのプレースホルダーのインスタンスを作成すると、次のように機能する可能性があります。

@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {        
        View rowView = v;
        if (rowView == null) {
            LayoutInflater inflater = this.getLayoutInflater();
                // GET INFLATE OF YOUR LAYOUT.
            rowView = inflater.inflate(R.layout.projectpeopledescrate, null);
             // CUSTOM ViewHolder Class Created in Adapter.
// name,title,comment are my components on the same listview clicked item.
            PPDViewHolder viewHolder = new PPDViewHolder();
            viewHolder.name     = (TextView) rowView.findViewById(R.id.ppeopledescrvname);
            viewHolder.title    = (TextView) rowView.findViewById(R.id.ppeopledescrvtime);
            viewHolder.comment  = (TextView) rowView.findViewById(R.id.ppeoplervcomment);
            viewHolder.hiddenLayout = (RelativeLayout) rowView.findViewById(R.id.hiddenCommentPanel); 
            rowView.setTag(viewHolder);
        }
          // ANOTHER object instance to apply new changes.
        PPDViewHolder holder = (PPDViewHolder) rowView.getTag();
// I've setted up visibility over the components. You can set your onClickListener over your buttons.
        holder.comment.setVisibility(View.GONE);
        holder.name.setVisibility(View.GONE);
        holder.title.setVisibility(View.GONE);
        holder.hiddenLayout.setVisibility(View.VISIBLE);
        holder.hiddenLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.MATCH_PARENT));
        holder.hiddenLayout.bringToFront();

    }

願わくば、あなたは同じものが欲しいのです。幸運を!

0
Hamza Waqas

これらのプロパティを設定します。

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

list_item.xmlファイル内のすべてのUI要素に対して。

これがアダプタセットで解決されない場合:

    v.imageView.setFocusable(false);
    v.imageView.setFocusableInTouchMode(false);
0
Iman Marashi

私はこのコードを持っています

this.mListView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                Log.v(TAG,"loul");
            }
        });

しかし、それは機能しませんでした

だから私はちょうどonItemSelectedListenerを下に置いて、それはOoで動作します:

this.mListView.setItemsCanFocus(false);
this.mListView.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        Log.v(TAG,"loul");
    }
});
//listener for nothing but it allow OnItemClickListener to work
this.mListView.setOnItemSelectedListener(new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {

    }
});
0
Kevin ABRIOUX