ListView项目不会在onCreate中更改其backgroundColor,但它会在onItemClick上更改

时间:2017-12-02 23:20:56

标签: android listview

我有两个列表,一个很长,一个很短。 将仅显示长的列表,并且长列表中也位于短列表中的列表项应该为蓝色backgroundColor。 你可以猜到,这不起作用。

除此之外,我可以更改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并以吐司方式显示其文本。

虽然可能还有其他选择可以做到这一点,但我想知道为什么背景颜色为&#34; A&#34;虽然项目在onItemClickListener中有效,但项目不会在创建时更改(它也不会崩溃)。

修改 我已经切换了setAdapter部分和if语句的位置(正如我在逻辑上的原始代码中所使用的那样),并使用setBackgroundResource作为android studio建议,但这并没有解决问题。

2 个答案:

答案 0 :(得分:1)

使用list.getchildat(),在括号内指定索引,应该可以工作。

答案 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));
       }
  }

以后注册点击()&#39;

      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));
               }
           }
       }
   });

为什么我使用&#34; .post()&#34;,因为没有它我们正在获取它的视图,但你的列表还没有被创建。

谢谢,快乐编码!!