2011-08-07 8 views
1

ListItemonItemClick보기를 바꾸고 싶습니다. 어댑터에ListItem보기 변경 ListView에서 선택

public void onItemClick (AdapterView<?> parent, View view, int position, long id) { 
    hlistAdapter.selected = position; 
} 

: 그리고 : 나는이 작업을 수행 할 때, 나는 문제를 다시 그리는 발생했습니다

public View getView (int position, View convertView, ViewGroup parent) { 
    View retval; 
    if (position == selected) 
     retval = LayoutInflater.from(parent.getContext()).inflate(R.layout.new_list_item_selected, null); 
    else 
     retval = LayoutInflater.from(parent.getContext()).inflate(R.layout.new_list_item, null); 

    TextView title = (TextView) retval.findViewById (R.id.location); 
    title.setText (dataObjects[position]); 

    return retval; 
} 

내가 이걸 어떻게해야합니까?

답변

2

여러 가지 방법이 있습니다. 내 어댑터 행 레이아웃 테두리를 역할을 프레임 함께 서라운드 및 getView (....) 항목을 선택한 경우 프레임의 배경 셰이프를 그냥 변경하십시오.

전달 된 View는 onClickListener를 첨부하면 Frame 클래스에 전달됩니다. 그런 다음 v.findViewById (...)를 사용하여 어댑터 행 레이아웃 의 다른 뷰를 찾고 수정하십시오. v.invalidate()를 사용하여 어댑터 데이터를 변경하지 않으면 특정 어댑터 행을 다시 그리게됩니다. 정의에 따라 onClickListener 히트를 얻으면 특정 어댑터보기 이 보이고 팽창하므로 UI ​​스레드를 사용하는 한 어댑터와 독립적 인보기를 조작 할 수 있습니다.

ListView는 표시되는 어댑터 행 또는 거의 표시되는 어댑터 행을 팽창시키기 때문에 조작하기 전에 프레임보기가 표시되도록해야합니다. 이를 위해 ListView.getFirstVisiblePosition() 및 ListView.getLastVisiblePosition()을 사용합니다.이 뷰는 현재 표시되는 어댑터 행을 알려줍니다. 여기

는 왼쪽에있는 아이콘과 아이콘의 오른쪽에있는 텍스트의 두 행이있는 어댑터 행 레이아웃의 예 :

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/AdapterRowAccounts_Border" 
    android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:padding="3dip" 
    android:background="@drawable/shape_adapterrowborder"  
> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/AdapterRowAccounts_Content" 
    android:paddingTop="1dip" 
    android:background="@drawable/shape_listviewbackground" 
    > 
    <ImageView 
     android:id="@+id/AdapterRowAccounts_Icon" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:tag="ic_subdirfolder" 
     android:src="@drawable/ic_accountedit" 
     android:layout_marginRight="3dip" 
     android:scaleType="centerInside" 
    /> 
    <TextView 
     android:id="@+id/AdapterRowAccounts_Text1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@id/AdapterRowAccounts_Icon" 
     android:textColor="#000" 
     android:text="test1" 
     android:textColorHighlight="#FFF" 
     android:singleLine="true" 
     android:ellipsize="middle" 
    /> 
    <TextView 
     android:id="@+id/AdapterRowAccounts_Text2" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/AdapterRowAccounts_Text1" 
     android:layout_alignLeft="@id/AdapterRowAccounts_Text1" 
     android:text="test2" 
     android:textColor="#000" 
     android:textColorHighlight="#FFF" 
     android:singleLine="true" 
     android:ellipsize="middle" 
     android:textSize="10dip" 
    /> 
</RelativeLayout> 
</FrameLayout> 

을 그리고 이것은의 getView에서 코드의 스티치 (int이며 위치 ...) 테두리를 변경합니다. Frame은 레이아웃의 가장 바깥 쪽 요소이기 때문에 getView()에 의해 전달 된 "v"는 Frame 클래스입니다.

if (mPosition >= 0 && mPosition < this.getCount()) { 
     mBundle = this.getItem(mPosition); 
     // If it is the currently selected row, change the background 
     ImageView mIcon = (ImageView) v.findViewById(R.id.AdapterRowAccounts_Icon); 
     if (mPosition == mSelectedPosition) { 
      v.setBackgroundResource(R.drawable.shape_adapterrowborder); 
      mIcon.setImageResource(R.drawable.ic_accountedit); 
     } else { 
      v.setBackgroundResource(R.drawable.shape_adapterrow); 
      mIcon.setImageResource(R.drawable.ic_account); 
     } 

}

관련 문제