2017-12-02 111 views
0

我有两个列表,一个长和一个短列表。 只显示较长的一个,并且长列表中也在短列表中的列表项应获得蓝色backgroundColor。你可以猜到,这是行不通的。ListView项目不会在onCreate中更改它的backgroundColor,但它确实onItemClick

除此之外,我可以更改onItemClick项目的backgroundColor。 (这工作)

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_couple_file); 

List<String> longList = new ArrayList<String>(); 
longList.add("A"); 
longList.add("B"); 
List<String> shortList = new ArrayList<String>(); 
longList.add("A"); 

//  display longList 
ListView list = (ListView) findViewById(R.id.list); 
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, 
android.R.layout.simple_list_item_1, longList); 
    list.setAdapter(listAdapter); 

//  look for common elements 
    for (int i = 0; i < longList.size(); i++) { 
     if (shortList.contains(longList.get(i))) { 
      View view = listAdapter.getView(i, null, list); 
//  should change the item view's color, but it doesn't 
      view.setBackgroundResource(R.color.blue); 
     } 
    } 

    registerClick(); 
} 

private void registerClick() { 
    list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View viewClicked, int position, long id) { 
//  however, this does change the item view's color  
viewClicked.setBackgroundResource(R.color.red); 
    } 
} 

我知道,if语句的作品,我都投以一个TextView,并展示了其在举杯文本。

虽然可能有完全的其他选项来做到这一点,但我想知道为什么backgroundColor的“A”项不会改变onCreate而它应该(它也不会崩溃),尽管它工作在onItemClickListener。

编辑: 我皆已setAdapter部分的位置和if语句(如我在原来的代码有它在逻辑上),并且由于Android工作室建议使用setBackgroundResource,但这并没有解决问题。

+0

我认为这是因为它使用了simple_list_item_1的背景颜色。在您运行适配器之前不会设置它。尝试让它在适配器中处理时更改它。或者您可以在适配器显示项目后找出想要更改的项目。 –

回答

0

亲切移动你的代码::

for (int i = 0; i < longList.size(); i++) 
{ 
     if (shortList.contains(longList.get(i))) 
     { 
      View view = listAdapter.getView(i, null, list); 
      // should change the item view's color, but it doesn't 
      view.setBackgroundColor(getResources().getColor(R.color.blue)); 
     } 
    } 

后 'registerClicks()':

 registerClick(); 

     for (int i = 0; i < longList.size(); i++) 
     { 
      if (shortList.contains(longList.get(i))) 
      { 
       View view = listAdapter.getView(i, null, list); 
       // should change the item view's color, but it doesn't 
       view.setBackgroundColor(getResources().getColor(R.color.blue)); 
      } 
    } 

其实,问题是,你调用之前的背景变化实际列出你的列表视图。所以它没有得到你想改变背景颜色的孩子的意见。

编辑:

使用此代码:

list.post(new Runnable() { 
     @Override 
     public void run() { 
      for (int i = 0; i < longList.size(); i++) { 
       if (shortList.contains(longList.get(i))) { 
        list.getChildAt(i).setBackgroundColor(
          getResources().getColor(R.color.blue)); 
       } 
      } 
     } 
    }); 

为什么我使用“员额()”,它因为没有这一点,我们取它的看法,但不会创建列表尚未。

感谢和快乐编码!

+0

我改变了我的代码的顺序,你可以在我编辑的文章中看到,也尝试了你的建议,但问题仍然是一样的。 – dennis1611

+0

嘿丹尼斯,我解决了你的问题。看到我更新的代码。 –

+0

非常感谢!这解决了我的问题,但我不完全明白为什么需要它。 – dennis1611

1

使用list.getchildat(),指定括号内的索引应该有效。

相关问题