2015-09-05 164 views
0

我的問題與我的簡單應用程序。它使用一個ListView已到: - 按下時,它是在視圖模式 打開一個新的活動 - 高亮顯示所選項目時,它在編輯模式Android ListView項目選擇和重置

我做了以下內容:

 ListView lv = (ListView)findViewById(R.id.categoryListView); 

     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, 
            long id) { 

       String entry = (String) parent.getItemAtPosition(position); 

       if (_editMode) 
        view.setBackgroundColor(Color.parseColor("#5B5B5B")); 
       else 
       { 
        Intent intent = new Intent(MainActivity.this, CategoryActivity.class); 
        intent.putExtra("CATEGORY", entry); 
        startActivity(intent); 
       } 
      } 
     }); 

然後我想,當我打開查看模式下,所有項目必須取消,而我這樣做:

for (int i = 0; i < lv.getAdapter().getCount(); i++) 
{ 
    lv.getChildAt(i).setBackgroundColor(Color.parseColor("#FFFFFF")); 
} 

但這只是如果列表視圖中的所有項目都可見做工精細。 我試過在適配器上實現這個沒有成功...

任何建議?

謝謝!

編輯

好賈瓦德回答後,我只是想出瞭如何做「getView」方法的工作。所以這是我用過的解決方案:

我宣佈包含所選項目的ArrayList:

ArrayList<String> itemSelected = new ArrayList<String>(); 

這是ListView的onItemClick監聽器(在這裏您可以選擇和取消選擇的項目):

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, 
           long id) { 


       String entry = (String) parent.getItemAtPosition(position); 

       if (itemSelected.contains(entry)) 
       { 
        itemSelected.remove(entry); 
       } 
       else 
       { 
        itemSelected.add(entry); 
       } 

       ((ArrayAdapter<String>)lv.getAdapter()).notifyDataSetChanged(); 
     } 
    }); 

這是getView方法的ovverride:

itmList.setAdapter(new ArrayAdapter<String>(this,R.layout.list_black_text,R.id.list_content, itmStrList){ 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      if (convertView != null) 
      { 
       if (itemSelected.contains(itmList.getAdapter().getItem(position))) { 
        convertView.setBackgroundColor(Color.RED); 
       } else { 
        convertView.setBackgroundColor(Color.parseColor("#5B5B5B")); 
       } 
      } 

      return super.getView(position, convertView, parent); 
     } 
    }); 

這是怎麼取消選擇所有項目:

 itemSelected.clear(); 

     ((ArrayAdapter<String>)lv.getAdapter()).notifyDataSetChanged(); 

謝謝:)人

+1

改變適配器類'getView(...)'方法而不是改變'listview'項的背景顏色。 – Rustam

回答

1

我覺得你的問題是你有沒有注意查看回收。當你改變視圖背景的顏色時,視圖可以被回收,並且你會有不需要的東西。詳細信息請查看link

你應該有一個,可以說布爾變量,在你的基本數據稱爲像isSelected。並將這些代碼添加到getView()方法中。

if(item.isSelected()){ 
      setBackgroundColor(Color.parseColor("#5B5B5B")); 
    } 
    else{ 
      setBackgroundColor(Color.parseColor("#FFFFFF")); 
    } 

然後在你的onItemClick添加替換view.setback ...通過

lv.getAdapter().getItem(position).setSelected(true); 
    lv.getAdapter().notifyDataSetChanged(); 

您可能需要一個轉換。

最後改變這種

for (int i = 0; i < lv.getAdapter().getCount(); i++) 
{ 
    lv.getChildAt(i).setBackgroundColor(Color.parseColor("#FFFFFF")); 
} 

這樣:

for (int i = 0; i < lv.getAdapter().getCount(); i++) 
{ 
    lv.getAdapter().getItem(i).setSelected(false); 
} 

lv.getAdapter().notifyDataSetChanged(); 

之所以你的部分代碼只能如果所有的項目都可見是視圖循環。另外lv。getChildAt()僅爲您提供可見的視圖。您的代碼可能會崩潰,因爲adapter.getcount可能大於listview子項的數量。

希望它有幫助。