2012-03-31 11 views
0

Ich versuche, ein Spinner in einer Listenansicht Element in Android platzieren. Das Problem ist, dass dies verhindert, dass die Zeile während eines Druckvorgangs hervorgehoben wird und der onItemClickListener nicht von der ListView aufgerufen wird. Im Grunde versuche ich, die Funktionalität in der Google Music App nachzuahmen. Weiß jemand, wie man das macht? Dies ist der Code, den ich versucht haben (ich weiß, es ist nicht die beste sein kann ... nur zusammen einen kurzen Eindruck zu werfen, die das Problem zeigt):Spinner in ListView verhindert Hervorhebung in Android

Aktivität:

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; 
    } 

} 

Dies ist die Liste Adapter :

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; 
    } 
} 

Haupt Layout für die Aktivität

<?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> 

Layout für die Folge:

<?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> 

Danke für jede Hilfe!

Antwort

0

hatte ich das gleiche Problem mit Image, und wurde, was benötigt

mImageButton.setFocusable(false); 

ich es ist das gleiche für Spinner garantee nicht zu tun, aber mein Geld darauf.

Mit freundlichen Grüßen.

+0

Das schien das Highlight und Callback richtig funktionieren zu lassen. Mein Problem ist nun, dass der Bereich "Spinner" jetzt dunkler ist, wenn die Reihe angetippt wird. Wie auch immer, um das zu beheben? Entschuldigung immer noch ziemlich neu in der Android-Entwicklung. – Stargex

+0

Noch einmal glaube ich, ImageButton könnte Ihnen zu Hilfe kommen, besonders die allerersten Dinge auf der [this] (http://developer.android.com/reference/android/widget/ImageButton.html) Seite. Keine Garantie. – pouzzler

+0

Ich habe vorher mit den Selektoren gespielt. Hatte gehofft, dass es einen eleganteren/leichteren Weg gab. Am Ende hatte ich nur zwei Selektoren und schaltete sie aus, wenn der Benutzer auf den Spinner oder andere Teile des Listenelements tippte. – Stargex