2013-08-23 81 views
5

我有一個自定義列表視圖和一個自定義適配器。 單擊此列表視圖的一行時,TextView的文本將設置爲白色,並且此行的背景設置爲黑色。ListView中的setOnItemClickListener影響多行

一切都很好,但是當單擊一行時,其他行的背景顏色也設置爲黑色,並且上下滾動時都會混亂起來。

getView()的自定義適配器

public View getView(final int position, View convertView, ViewGroup parent) { 
    final ListItem holder; 
    View vi=convertView; 

    if(vi==null){ 
     vi = inflater.inflate(R.layout.list, null); 
     holder = new ListItem(); 
     holder.nametext= (TextView) vi.findViewById(R.id.name); 
     vi.setTag(holder); 

    }else{ 
     holder = (ListItem) vi.getTag(); 
    } 

    holder.nametext.setText(""+item.name); 
    return vi; 
} 

在mainactivity:

CustomAdapter listadapter = new CustomAdapter(context, R.layout.list, items); 
list.setAdapter(listadapter); 

    list.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> adapter, View view, int position, long arg){ 
       TextView v = (TextView) view.findViewById(R.id.name); 
       view.setBackgroundColor(Color.BLACK); 
       v.setTextColor(Color.WHITE); 
     } 

    }); 

我試圖puttin的setOnItemClickListener在getView(),但沒有運氣要麼..

有什麼幫助嗎?謝謝。

回答

6

自定義列表視圖「創建」爲顯示視圖僅當行向下滾動時,下一行顯示會像第一行一樣受到影響。

要防止此問題,您需要在ListItem中創建一個布爾型字段已點擊;

然後單擊視圖時,該item.Clicked設置爲其中getView()

final ListItem item = items.get(position); 

List<ListItem> items; 

爲您的適配器的變量

實施:

您需要設置setOnClickListener在getView(),如下

vi.setOnClickListener(new OnClickListener(){ 

     @Override 
     public void onClick(View arg1) { 

      if(previousView!=null){ 
       ListItem previousItem = items.get(previousPosition); 
       previousItem.Clicked = false; 
      } 

      item.Clicked = true; 
      previousView = arg1; 
      previousPosition = position; 
      notifyDataSetChanged(); 
     } 

    }); 



    if(!item.isClicked){ 
     holder.nametext.setTextColor(Color.BLACK); 
     vi.setBackgroundColor(Color.WHITE); 
    }else{ 
     holder.nametext.setTextColor(Color.WHITE); 
     vi.setBackgroundColor(Color.BLACK); 
    } 

}); 
+0

這對我工作多虧 – ralph

+0

@Chris:'vi.setOnClickListener'或'vi.setOnItemClickListener'? –

+0

@ LuisA.Florit當然是vi.setOnItemClickListener :) – creativecreatorormaybenot

0

這是你可以通過設置避免列表視圖的緩存顏色提示的默認效果「機器人:cacheColorHint」屬性@null這樣

<ListView 
     android:id="@+id/lstEventComment" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"  
     android:cacheColorHint="@null" 
/> 
+0

我不認爲我的問題是因爲XML的。我嘗試了所有可能的方法來修復它從XML(移除所有項目+您的建議focusable和clickable),但它沒有工作.. – ralph

相關問題