2011-10-30 2 views
2

이것은 일종의 렌더링 최적화 등으로 인한 느낌이 들지만 확실하지 않습니다.목록보기에 여러 개의 선택된 항목이 표시됩니다.

필자는 목록보기를 사용하며 항목을 선택하면 배경색이 변경되어 시각적으로 선택되어 있습니다.

목록 위쪽에있는 항목을 선택한 다음 아래로 스크롤하면 한 번보기에서 벗어난 다른 선택된 항목이 표시되어 목록이 화면 (스크롤)을 넘어 확장 될 때 문제가 발생합니다. 같은 시간에 화면에서 선택한 항목). 이것은 반대 방향으로도 작동합니다. 맨 아래에있는 항목을 선택한 다음 맨 위로 스크롤하면 다른 항목이 선택되어 표시됩니다.

또 다른 메모, 선택한 항목 사이의 거리가 일정하지 않은 경우, 내가 가로로 장치를 회전하면 선택한 항목 사이의 거리가 적습니다.

문제가 무엇인지 명확하지 않은 경우 그림을 첨부했습니다.

이것은 최소 목록과 함께 하나의 선택한 항목 만 표시합니다. enter image description here

여기 상단의 항목을 선택했습니다. enter image description here

아래로 스크롤하면 (스크롤 막대 참조) 선택한 다른 항목이 표시됩니다. enter image description here

코드를 입력하십시오.

목록 조각.

public class ResultListFragment extends ListFragment { 

BookListAdapter mBooksArray; 
BookData api; 
View footer; 
ListView list; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Activity parent = getActivity();  
     BookSearch app = (BookSearch) parent.getApplicationContext(); 

    api = app.bookAPI; 

    mBooksArray = new BookListAdapter(/*some params*/); 
    mBooksArray.currentActivity = parent; 


} 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

     list = (ListView) inflater.inflate(R.layout.search_results, null); 

    footer = inflater.inflate(R.layout.load_more, null); 

    return list; 
} 

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    list.addFooterView(footer); 

    list.setAdapter(mBooksArray); 
} 

} 

그리고 ArrayAdapter는 onClick 메서드에서 색상이 변경됩니다.

public class BookListAdapter extends ArrayAdapter<Book> { 

ArrayList<Book> books; 
private BookData bookData; 
Activity currentActivity; 
final BookListAdapter self = this; 
private View selected = null; 



public void update() { 
    currentActivity.runOnUiThread(new Runnable() { 
     public void run() {  
      self.notifyDataSetChanged(); 
     } 
    }); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 

     LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
       Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(R.layout.search_list_view_item, null); 
    } 
    /*some code to set the image and text */ 
    v.setOnClickListener(new OnItemClickListener(position)); 
    return v; 
} 

public void onClick(int position, View view) { 
      // this log always reports the correct position when i select a list item 
    Log.i(new Integer(position).toString(), books.get(position).title); 
    if(selected != null) { 
     selected.setBackgroundResource(R.drawable.list_view_bg); 
    } 
    selected = view; 
    selected.setBackgroundResource(R.color.listSelected); 

} 

private class OnItemClickListener implements OnClickListener{   
     private int mPosition; 

     OnItemClickListener(int position){ 
      mPosition = position; 
     } 
     @Override 
     public void onClick(View view) { 
     BookListAdapter.this.onClick(mPosition, view); 
     }    
    } 
} 

답변

2

목록보기 뷰 (View v = convertView; if (v == null) { } ...와 파트)를 재활용, 그래서 당신은 또 다시 사용되는 뷰에 배경을 설정하고 있습니다. 대신 모델에서 "selected"플래그를 설정해야합니다 (Book 객체 자체). 주석 당신의 getView의 부분에서, 당신은 그 말 :

if (book.isSelected()) { 
    v.setBackgroundResource(R.color.listSelected) 
} 
+0

그래서 내가 목록을 아래로 스크롤, 그것으로 목록에서 다른 항목을 생성의 getView 메소드를 호출 생각에 수정입니다 그들은 보기에 가까이 다가 가면 되겠습니까? –

+0

예,'getView()'가 각 행에 대해 호출됩니다. 캐시에 표시 할 수있는 뷰의 수를 유지하거나 그 이후에 다시 사용합니다. 따라서 아래로 스크롤하면 첫 번째 항목에 사용 된 동일한보기가 n + 1 항목 (또는 그 이후)에 사용됩니다. 그렇기 때문에 배경을 포함하여 언제나 볼 수있는 모든 속성을 설정해야합니다. – dmon

관련 문제