2012-03-31 11 views
0

私はアンドロイドのリストビュー項目の中にスピナーを配置しようとしています。問題は、これがプレス中に行が強調表示されず、onItemClickListenerがListViewによって呼び出されていないように見えることです。基本的には、Googleミュージックアプリの機能を模倣しようとしています。誰もこれを行う方法を知っていますか?これは私が(ちょうど一緒に問題を示して迅速なサンプルを投げて...私はそれが最高ではないかもしれない知っている)しようとしているコードです:リストビューのスピナーがアンドロイドのハイライト表示を妨げます

活動:

public class ListViewTestActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ListView listView = (ListView) findViewById(R.id.listView1); 

     DataHolder data = new DataHolder(this); 
     DataHolder data1 = new DataHolder(this); 
     DataHolder data2 = new DataHolder(this); 
     DataHolder data3 = new DataHolder(this); 
     DataHolder data4 = new DataHolder(this); 

     DataAdapter d = new DataAdapter(this, R.layout.rowview, new DataHolder[] { data, data1, data2, data3, data4 }); 
     listView.setAdapter(d); 
     listView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       Log.e("ERROR", "look at me!"); 

      } 
     }); 
    } 
} 


public class DataHolder { 

    private int selected; 
    private ArrayAdapter<CharSequence> adapter; 

    public DataHolder(Context parent) { 
     adapter = ArrayAdapter.createFromResource(parent, R.array.choices, android.R.layout.simple_spinner_item); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    } 

    public ArrayAdapter<CharSequence> getAdapter() { 
     return adapter; 
    } 

    public String getText() { 
     return (String) adapter.getItem(selected); 
    } 

    public int getSelected() { 
     return selected; 
    } 

    public void setSelected(int selected) { 
     this.selected = selected; 
    } 

} 

これはリストアダプタであります:活性について

public class DataAdapter extends ArrayAdapter<DataHolder> { 

    private Activity myContext; 

    public DataAdapter(Activity context, int textViewResourceId, DataHolder[] objects) { 
     super(context, textViewResourceId, objects); 
     myContext = context; 
    } 

    // We keep this ViewHolder object to save time. It's quicker than findViewById() when repainting. 
    static class ViewHolder { 
     protected DataHolder data; 
     protected TextView text; 
     protected Spinner spin; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = null; 

     // Check to see if this row has already been painted once. 
     if (convertView == null) { 

      // If it hasn't, set up everything: 
      LayoutInflater inflator = myContext.getLayoutInflater(); 
      view = inflator.inflate(R.layout.rowview, null); 

      // Make a new ViewHolder for this row, and modify its data and spinner: 
      final ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) view.findViewById(R.id.text); 
      viewHolder.data = new DataHolder(myContext); 
      viewHolder.spin = (Spinner) view.findViewById(R.id.spin); 
      viewHolder.spin.setAdapter(viewHolder.data.getAdapter()); 

      // Used to handle events when the user changes the Spinner selection: 
      viewHolder.spin.setOnItemSelectedListener(new OnItemSelectedListener() { 

       @Override 
       public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
        viewHolder.data.setSelected(arg2); 
        viewHolder.text.setText(viewHolder.data.getText()); 
       } 

       @Override 
       public void onNothingSelected(AdapterView<?> arg0) { 
        Log.d("DBGINF", "asdf"); 
       } 

      }); 

      // Update the TextView to reflect what's in the Spinner 
      viewHolder.text.setText(viewHolder.data.getText()); 

      view.setTag(viewHolder); 

      Log.d("DBGINF", viewHolder.text.getText() + ""); 
     } else { 
      view = convertView; 
     } 

     // This is what gets called every time the ListView refreshes 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.text.setText(getItem(position).getText()); 
     holder.spin.setSelection(getItem(position).getSelected()); 

     return view; 
    } 
} 

メインレイアウト

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" 
    android:layout_width="fill_parent" android:layout_height="fill_parent"> 
    <ListView android:id="@+id/listView1" android:layout_height="match_parent" android:layout_width="match_parent" /> 
</LinearLayout> 

行のレイアウト:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" android:layout_width="match_parent" 
    android:layout_height="wrap_content" android:weightSum="1" > 
    <TextView android:layout_width="wrap_content" 
     android:layout_height="match_parent" android:id="@+id/text" 
     android:layout_weight="0.5" android:textSize="25sp" /> 
    <Spinner android:layout_width="0dp" android:layout_height="wrap_content" 
     android:id="@+id/spin" android:prompt="@string/choice_prompt" 
     android:layout_weight="0.5" /> 
</LinearLayout> 

ありがとうございました!

答えて

0

私はのImageButtonと同じ問題を抱えていたし、必要とされたことは、私はそれがスピナーのために同じですが、私のお金がそれにあるgaranteeすることはできません

mImageButton.setFocusable(false); 

を行うことでした。

よろしくお願いいたします。

+0

ハイライトとコールバックが正しく機能するように見えました。今私の問題は、行がタップされているときにSpinner領域がより暗い青色になっていることです。とにかくそれを修正するには?申し訳ありませんが、まだAndroid開発には全く新しいです。 – Stargex

+0

もう一度私はImageButtonがあなたの助けになると信じています、特に[this](http://developer.android.com/reference/android/widget/ImageButton.html)ページの最初のものです。何の保証もありません。 – pouzzler

+0

以前セレクターで遊んでいました。よりエレガントな/簡単な方法があることを望んでいた。私は2つのセレクタを持つだけで、ユーザーがスピンナまたはリスト項目の他の部分をタップしているかどうかに応じてそれらを切り替えることになりました。 – Stargex

関連する問題