2012-03-24 30 views
0

私はリストでAndroidのアクティビティを持っています。各項目をクリックすると、新しいレイアウトがテキストの下にいくつかのボタンで表示されます。ListViewでsetSelectionが奇妙な動作を引き起こしています

最後にクリックしたときにメニューが失われ、スクロールする必要があるため、クリックしたときに選択したアイテムを中央に設定したいと思っていました。これは非常に混乱します。

私のコードは、最後に選択した項目の位置を保存します。したがって、別の項目をクリックすると、その項目の編集メニューを非表示にすることができます。

setSelectionを使用すると、この動作が中断し、listViewの位置が変更されたように見えます。これは、そのロジックがもう機能しないためです。すべてのオプションが表示されたままになり、クリックされた行の代わりに異なる行が反応し、選択した行の下の行をクリックすると、NullPointerExceptionがスローされます。

私は、位置の代わりにビューを保存し、setSelectionの代わりにscrollToなどを使用してさまざまな方法でこれを実行しようとしましたが、常に破損しているようです。これは問題のコードです、あなたはどんなアイデアを持っていますか?どうもありがとう。

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    RelativeLayout itemView = (RelativeLayout) mListView.getChildAt(position); 
    LinearLayout showItemOptionsView = (LinearLayout) itemView.findViewById(R.id.itemOptionsView); 
    showItemOptionsView.setVisibility(View.VISIBLE); 

    // Sets previous to GONE 
    if (mPreviouslySelectedItemPosition != -1) { 
     itemView = (RelativeLayout) mListView.getChildAt(mPreviouslySelectedItemPosition); 
     showItemOptionsView = (LinearLayout) itemView.findViewById(R.id.itemOptionsView); 
     showItemOptionsView.setVisibility(View.GONE); 
    } 

    mListView.setSelection(position); 

    mPreviouslySelectedItemPosition = position; 
    } 

このレイアウト

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

    <TextView 
    android:id="@+id/groceryListName" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:textSize="20dp" /> 

    <LinearLayout 
    android:id="@+id/addItemView" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/groceryListName" 
    android:gravity="center_vertical" 
    android:orientation="horizontal" > 

    <EditText 
     android:id="@+id/itemName" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:inputType="textAutoComplete" /> 

    <Button 
     android:id="@+id/addItem" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:gravity="right|center_vertical" 
     android:onClick="addItem" 
     android:text="@string/addItem" /> 
</LinearLayout> 

<TextView 
    android:id="@+id/clickOnItemToEdit" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_below="@id/addItemView" 
    android:layout_marginBottom="5dp" 
    android:text="@string/clickOnItemToEdit" 
    android:textSize="10dp" /> 

<Button 
    android:id="@+id/shop" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_gravity="bottom" 
    android:onClick="startShoppingActivity" 
    android:text="@string/startShopping" /> 

<ListView 
    android:id="@+id/items" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_above="@id/shop" 
    android:layout_below="@id/clickOnItemToEdit" /> 

</RelativeLayout> 

であり、これは、このアダプタからコード

@Override 
    public void bindView(View view, Context context, Cursor cursor) { 
    int idIndex = cursor.getColumnIndexOrThrow(ItemAndroidDAO._ID); 
    String id = cursor.getString(idIndex); 
    TextView idView = (TextView) view.findViewById(R.id.itemId); 
    idView.setText(id); 

    int productIdIndex = cursor.getColumnIndexOrThrow(ItemAndroidDAO.PRODUCT_ID_COLUMN); 
    String productId = cursor.getString(productIdIndex); 

    Product product = productFacade.findById(Long.parseLong(productId)); 
    // The product must exist, otherwise it fails. 
    AppException.assertNotNull(product, "The related product cannot be null."); 

    TextView productIdView = (TextView) view.findViewById(R.id.itemProductName); 
    productIdView.setText(product.getName()); 

    int quantityViewIndex = cursor.getColumnIndex(ItemAndroidDAO.QUANTITY_COLUMN); 
    int quantity = cursor.getInt(quantityViewIndex); 
    TextView quantityView = (TextView) view.findViewById(R.id.itemQuantity); 
    quantityView.setText(Integer.toString(quantity)); 
    } 

and the newView() (it's in a superclass) 

     @Override 
     public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View listView = (View) layoutInflater.inflate(getLayoutResource(), null); 
     bindView(listView, context, cursor); 
     return listView; 
     } 

APIレベル(7である行のレイアウト

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/showItemView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <TextView 
     android:id="@+id/itemId" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:visibility="gone" /> 

    <TableRow 
     android:id="@+id/itemTable" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center_vertical" 
     android:stretchColumns="3" > 

     <Button 
      android:id="@+id/itemQuantityLess" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="right|center_vertical" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:onClick="lessQuantityHandler" 
      android:text="@string/itemQuantityLess" /> 

     <TextView 
      android:id="@+id/itemQuantity" 
      android:layout_width="40dp" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:gravity="center_horizontal" 
      android:textSize="20sp" /> 

     <Button 
      android:id="@+id/itemQuantityMore" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="left|center_vertical" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:onClick="moreQuantityHandler" 
      android:text="@string/itemQuantityMore" /> 

     <TextView 
      android:id="@+id/itemProductName" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="left|center_vertical" 
      android:textSize="20sp" /> 
    </TableRow> 

    <LinearLayout 
     android:id="@+id/itemOptionsView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@id/itemTable" 
     android:gravity="center|right" 
     android:orientation="horizontal" 
     android:visibility="gone" > 

     <Button 
      android:id="@+id/editItem" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:gravity="right|center_vertical" 
      android:onClick="editItem" 
      android:text="@string/editItem" /> 

     <Button 
      android:id="@+id/removeItem" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:gravity="right|center_vertical" 
      android:onClick="removeItem" 
      android:text="@string/removeItem" /> 
    </LinearLayout> 

</RelativeLayout> 

あります2.1)。

+0

は、アダプタ – dldnh

+0

良い提案を投稿することができます、私は、アダプタのコードでポストを編集しました。ありがとう。 –

+0

私はそれがあなたの行レイアウト( 'ListView'行の' ListView'ですか?)だと疑います。 – Luksprog

答えて

0

あなたのコード(またはあなたがしようとしていること)に何が起こっているのか分かりませんが、別の方法を試すことができます。 onItemClick()は、単に持っているだろうに、その後

long selectedPosition = -1; // -1 no visible LinearLayout 

:あなたのアダプタのbindView()方法で、その後

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
     // setter method that will update the adapter's selectedPosition to hold the id of the row clicked 
    adapter.setSelectedPosition(id); 
     // notify the adapter that it need to update the data 
     // I don't know exactly what adapter you implement, the notifiyDataSetChanged() might not work(you'll have to make another cursor). 
    adapter.notifyDataSetChanged(); 
} 

代わりにあなたのアダプタを作るonItemClick()方法であなたの選択した行で作業しようとしているのフィールドを持っていますあなたが行うこと以外に、selectedPositionがカーソル行IDと等しいかどうかを確認してください。その場合は、その後LinearLayoutを検索し、それが見えるように:

//... 
long theId = cursor.getLong(cursor.getColumnIndex("_id")); 
if (theId == selectedPosition) { 
     //this is the row that the user clicked, so show the extra stuff 
     LinearLayout ll = (LinearLayout) view.findViewById(R.id.itemOptionsView); 
     ll.setVisibility(View.VISIBLE); 
} else { 
     // implement this so you don't end up with a recycled view. 
     LinearLayout ll = (LinearLayout) view.findViewById(R.id.itemOptionsView); 
     ll.setVisibility(View.GONE); 
}  
//... 
+0

ありがとう、たくさんの男、そのトリックでした。 –

関連する問題