2015-09-05 92 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子项的数量。

希望它有帮助。