2012-05-22 2 views
6

行にチェックボックス、4つのテキストビュー、および2つのスピナーが含まれているリストビューを作成しようとしています。各行のスピナーの値は、その行の実際の項目に直接関係するため、異なる必要があります。ちょっと複雑にするため、スピナーとその隣にある2つのテキストフィールドはチェックボックスがチェックされていない限り表示されません(setVisibility(View.GONE))。リスト項目をクリック可能(チェックボックスではなく)にするだけで、スピナーは表示されたらクリック可能にする必要があります。スピードがリストロー内に入力されたときにandroid onListItemClickが機能しない

私のコードはすべて正しく動作していますが、スピナーが入力されたときはその行のリストアイテムをクリックすることができません。私はまだその行のスピナーから値を選択することができますが、行の他のどこに触れても何もしません。いくつかの行は、スピナーにデータを返さず、正しく動作しているので、スピナーに接続されているアダプターと関係していると思います。

また、私はリストビューのリサイクルについて説明しなければならないことは知っていますが、まだそれほど得意ではありません。

私は完全に狂気になる前に、誰かが間違っていることを指摘してくれることを願っています。ここで

は、リストビューのXML

<ListView android:id="@+id/android:list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 

<TextView android:id="@+id/android:empty" 
      android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/empty"/> 
</LinearLayout> 

そして、ここでは、行のXML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <LinearLayout android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 

     <CheckBox android:id="@+id/pl_selected" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:focusableInTouchMode="false" 
      android:clickable="false" 
      android:focusable="false" 
      android:layout_weight="1"/> 

     <TextView android:id="@+id/name" 
       android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:focusableInTouchMode="false" 
     android:clickable="false" 
     android:focusable="false"/> 

    <TextView android:id="@+id/name2" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:focusableInTouchMode="false" 
     android:clickable="false" 
     android:focusable="false"/> 

</LinearLayout> 

<LinearLayout android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 

    <TextView android:id="@+id/pl_tv1" 
      android:text="@string/pl_tv1" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:focusableInTouchMode="false" 
      android:clickable="false" 
      android:focusable="false" 
      android:visibility="gone"/> 

    <Spinner android:id="@+id/pl_spin1" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:visibility="gone" 
      android:focusableInTouchMode="false" 
      android:focusable="false"/> 
</LinearLayout> 
<LinearLayout android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 

    <TextView android:id="@+id/pl_tv2" 
      android:text="@string/pl_tv2" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:focusableInTouchMode="false" 
      android:clickable="false" 
      android:focusable="false" 
      android:visibility="gone"/> 

    <Spinner android:id="@+id/pl_spin2" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:visibility="gone" 
      android:focusableInTouchMode="false" 
      android:focusable="false"/> 
</LinearLayout> 
</LinearLayout> 

そして、ここである取り出し無関係なもののほとんどは活動です:

import android.widget.SimpleCursorAdapter; 
import mdhsoft.band.Tab.DbAdapter; 
import mdhsoft.band.Tab.R; 
import android.os.Bundle; 
import android.app.ListActivity; 
import android.database.Cursor; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.CheckBox; 
import android.widget.ListView; 
import android.widget.Spinner; 
import android.widget.TextView; 

public class PLActivity extends ListActivity { 
    private static final int DONE_ID = Menu.FIRST; 
    private DbAdapter mDbHelper; 
private int mPlId; 
private CheckBox mCheckBox; 
private Spinner mSpin1; 
private Spinner mSpin2; 
private TextView mtv1; 
private TextView mtv2; 
private int mItemId; 
private SimpleCursorAdapter mAllItems; 
private Cursor mSCursor; 
private Cursor mcurSpin1; 
private Cursor mcurSpin2; 


    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.pl_list); 

     Bundle extras = getIntent().getExtras(); 
     mPlId = extras.getInt(DbAdapter.KEY_PLID); 
     mDbHelper = new DbAdapter(this); 
     mDbHelper.open(); 

     fillData(); 
     registerForContextMenu(getListView()); 
    } 

private void fillData() { 
    mSCursor = mDbHelper.fetchAllPl(mPlId); 
    startManagingCursor(mSCursor); 
    String[] from = new String[] 
     {"pl_selected", DbAdapter.KEY_SNAME, DbAdapter.KEY_SNAME2}; 
    int[] to = new int[]{R.id.pl_selected, R.id.name, R.id.name2}; 
    mAllItems = new SimpleCursorAdapter(this, R.layout.pl_row, mSCursor, from, to); 
    mAllItems.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 
     public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
      if(columnIndex == 3) { 
        CheckBox cb = (CheckBox) view; 
        cb.setChecked(cursor.getInt(3) > 0); 
        ViewGroup row = (ViewGroup)view.getParent(); 
        if (cursor.getInt(3) > 0) { 
         mcurSpin1 = (Spinner) row.findViewById(R.id.pl_spin1); 
         mcurSpin2 = (Spinner) row.findViewById(R.id.pl_spin2); 
         mtv1 = (TextView) row.findViewById(R.id.pl_tv1); 
         mtv2 = (TextView) row.findViewById(R.id.pl_tv2); 
         mcurSpin1.setVisibility(View.VISIBLE); 
         mtv1.setVisibility(View.VISIBLE); 
         mcurSpin2.setVisibility(View.VISIBLE); 
         mtv2.setVisibility(View.VISIBLE); 
         PopulateSpinner1(); 
         PopulateSpinner2(); 
        } 
        return true; 
      } 
      return false; 
     } 
    }); 
    setListAdapter(mAllItems); 
} 

private void PopulateSpinner1(){ 
    mcurSpin1 = mDbHelper.fetchSByItemId(mItemId); 
    startManagingCursor(mcurSpin1); 
    String[] from = new String[]{DbAdapter.KEY_SNAME}; 
    int[] to = new int[]{android.R.id.text1}; 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,     
      android.R.layout.simple_spinner_item, mcurSpin1, from, to); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    mSpin1.setAdapter(adapter); 

} 

private void PopulateSpinner2(){ 
    mcurSpin2 = mDbHelper.fetchMByItemId(mItemId); 
    startManagingCursor(mcurSpin2); 
    String[] from = new String[]{DbAdapter.KEY_MNAME}; 
    int[] to = new int[]{android.R.id.text1}; 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_spinner_item, mcurSpin2, from, to); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    mSpin2.setAdapter(adapter); 
} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    ViewGroup row = (ViewGroup)v; 
    mSCursor.moveToPosition(position); 
    mItemId = mSCursor.getInt(mSCursor.getColumnIndex(DbAdapter.KEY_SID)); 
    mCheckBox = (CheckBox) row.findViewById(R.id.pl_selected); 
    mcurSpin1 = (Spinner) row.findViewById(R.id.pl_spin1); 
mcurSpin2 = (Spinner) row.findViewById(R.id.pl_spin1); 
mtv1 = (TextView) row.findViewById(R.id.pl_tv1); 
mtv2 = (TextView) row.findViewById(R.id.pl_tv2); 
    if (mCheckBox.isChecked()) { 
     mCheckBox.setChecked(false); 
     mcurSpin1.setVisibility(View.GONE); 
     mtv1.setVisibility(View.GONE); 
     mcurSpin2.setVisibility(View.GONE); 
     mtv2.setVisibility(View.GONE); 
} 
    else { 
     mCheckBox.setChecked(true); 
     mcurSpin1.setVisibility(View.VISIBLE); 
     mtv1.setVisibility(View.VISIBLE); 
     mcurSpin2.setVisibility(View.VISIBLE); 
     PopulateSpinner1(); 
     PopulateSpinner2(); 

    } 
    } 

} 

ありがとうございますあなたが与えることができる任意の助けのためのdvance。

+0

フォーカスが届かないようにスピナーを設定してみてください。 'android:focusableInTouchMode = false ''と 'android:focusable =" false "'の中にあります。そうすれば、彼らはリストからフォーカスを奪うことはできませんが、あなたはまだそれを "クリック"して開くことができます。 – Barak

+1

あなたの答えをありがとう、私はすでにスピナーにフォーカスをフォーカスとフォーカスをfalseに設定している。私がそれを取り除くと、スピナーの中に何も入っていない行が壊れてしまいますので、確かに必要ですが問題は解決しません。 – collusionbdbh

答えて

11

android:descendantFocussability=blocksDescendantsを一番上の線形レイアウトに追加できます。これは参考になるかもしれません。

+0

Androに感謝します。構文は正しくはありませんでしたが、問題を解決しました。 – collusionbdbh

+3

正しい構文はandroid:descendantFocusability = "blocksDescendants"です。再度、感謝します。 – collusionbdbh

+1

これは本当に助けになりました! :) – user1051505

関連する問題