2011-08-19 3 views
0

50 개 항목으로 채워진 ListView가 있습니다. 내 ArrayAdapter에 사용하는 XML입니다.배경색 또는 드로어 블을 특정 항목으로 설정하는 방법과 목록 뷰를 스크롤하여 해당 색을 유지하는 방법

<?xml version="1.0" encoding="utf-8"?> 
<TextView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@android:id/text1" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:textAppearance="?android:attr/textAppearanceLarge" 
android:gravity="center_vertical" 
android:paddingLeft="6dip" 
android:minHeight="?android:attr/listPreferredItemHeight" 
android:background="@drawable/listview_background" 
android:textColor="#ff000000"> 
</TextView> 

나는 새로운 ArrayAdapter와를 만들

ArrayAdapter<String> list = new ArrayAdapter<String>(this, R.layout.my_simple_list); 

을 입력합니다. 그런 다음 String [] 항목을 목록에 추가합니다. 그때
setListAdapter(list); 

나열 할 문자열 [] 항목의 문자열을 추가하려면 전화 I 문자열의 배열을 통해 루프 루프를 사용하여 명령을 사용하여 나열 각 문자열을 추가 ((에는 list.add을 items.get을 나는)); 여기서 나는 for for loop 카운터이다.

for(int i=0;i<items.size();i++){ 
list.add(items.get(i)); 
} 

이렇게하면 ListView가 만들어지고 채워집니다. 또한 onListItemClick 함수가 있습니다.

public void onListItemClick(ListView parent, View v, int position, long id) { 
String Select = this.getListAdapter().getItem(position).toString(); 
if(copyitems.contains(Select)){ 
     v.setBackgroundResource(R.drawable.listview_background); 
    copyitems.remove(Select); 
}else{ 
    copyitems.add(Select); 
    v.setBackgroundColor(Color.GRAY); 
}  
} 

onListItemClick 함수에서 copyitems는 전역 변수로 선언하는 ArrayAdapter 변수입니다. 그래서이 함수는 listview의 선택된 항목의 텍스트를 저장하므로 나중에 그 텍스트를 복사 할 수 있습니다. 따라서 항목이 선택되면 텍스트가 복사 항목에 추가되고 동일한 항목이 선택되면 복사 항목에서 제거됩니다. 항목이 복사 항목에 추가 될 때마다 해당 항목의 배경이 회색으로 변경되고 항목이 복사 항목에서 제거되면 해당 항목의 배경이 원본으로 다시 설정됩니다. 이 모든 것이 잘 작동합니다. 하지만 (50과 같은) 항목이 많으면 화면에 모두 맞지 않으므로 화면에없는 항목을 선택하려면 아래로 스크롤해야하거나 항목에 도달해야합니다. 이것은 선택한 항목에서 스크롤하여 다시 컴백하면 배경이 원래대로 변경되고 다른 항목이 회색 배경으로 변경됩니다. 그래서 기본적으로 내 화면이 10 개의 항목에 적합하고 첫 번째 항목을 선택하고 스크롤하여 10을 통과 한 다른 항목 (예 : 11)을 선택합니다. 첫 번째 항목이 화면을 떠나서 11이 들어 오면 이미 회색으로 표시되어 있지만 선택하지 않았습니다. 첫 번째 항목을보기 위해 위로 스크롤하면 배경이 회색이되거나 회색이 아닐 수 있습니다. 회색이 아닌 경우 다른 항목의 배경이 두 번째 것과 같이 회색으로 설정됩니다. 아이템이 화면에서 사라졌을 때 아이템이 재활용되어 항목의 위치가 변경 되었기 때문에 이런 일이 발생 했습니까? 만약 내가 그 항목을 선택했다면, 어떻게하면 그 항목을 배경 화면에 회색으로 표시 할 수있게 할 수 있습니까? 내가하려고하는 것에 대해 더 나은 접근법이 있다면 말해주세요. 나는 안드로이드에 처음이다.

답변

0

자신 만의 어댑터를 작성해야합니다. BaseAdapter에서 연장하는 것이 좋습니다. 코드는 다음과 같습니다

// These are members of your activity 
private List<String> mList = null; 
private int mNewlyAddedItem; 

private class Adapter extends BaseAdapter { 

    @Override 
    public int getCount() { 
     return mList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 

     return (long)position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if(position == mNewlyAddedItem) { 
      convertView.setBackgroundColor(Color.GRAY); 
     } else { 
      convertView.setBackgroundResource(R.drawable.listview_background); 
     } 

     // Set text to our TextView 
     TextView nameText = (TextView)convertView.findViewById(R.id.text1); 
     nameText.setText(mList.get(position)); 

     return convertView; 
    } 

} 

하는 대신 onListItemClick 핸들러 내부에서 변화하는 배경의 방금 mNewlyAddedItem을 지정해야합니다 :

public void onListItemClick(ListView parent, View v, int position, long id) { 
    String Select = this.getListAdapter().getItem(position).toString(); 
    if(copyitems.contains(Select)){ 
     copyitems.remove(Select); 
     mNewlyAddedItem = -1; 
    }else{ 
     copyitems.add(Select); 
     mNewlyAddedItem = position; 
    }  
} 
mNewlyAddedItem = position; 

은 내가 바로 작업을 이해 바랍니다. 어쨌든 요점은 다음과 같습니다. 어떤 상태 (멤버 변수 Activity을 사용하여 설정할 수 있음)를 기반으로 뷰를 그리는 어댑터 코드를 변경하고 상태를 변경하면 뷰가 업데이트됩니다. getListView().invalidateViews()을 호출하여 모든 어떤 시점에서 발생하지 않는 경우보기).

+0

어떻게 어댑터 클래스를 사용합니까? 내 코드에 추가했지만 사용 방법을 모른다. setListAdapter (새 Adapter());를 작성합니까? ArrayList 목록을 어떻게 보내나요? – Boris

+0

해당 어댑터 '어댑터'를 호출하지 마십시오. 'Adapter'는 Android 인터페이스입니다. 목록 '목록'에 전화하지 마십시오.내 코드는 단지 예일뿐입니다. 당신의 작업을 알지 못하기 때문에 적절한 이름이 없습니다. 문자열이 동물의 이름 인 경우 어댑터 'AnimalAdapter'를 호출합니다. 그것을 사용하는 방법에 관해서는'setListAdapter (new Adapter())'가 (onCreate() 핸들러에서) 올바른 방법입니다. 이 어댑터는 당신의 액티비티의 내부 클래스이므로'private ArrayList list'와 같은 액티비티 멤버에 접근 할 수 있다고 생각했습니다. 동물을 대표한다면 'animalList'라고 부릅니다. – Victor

관련 문제