2014-11-06 162 views
0

我似乎无法弄清楚如何使一个或多个listview项目背景更改颜色。Android ListView设置项背景

我目前正试图通过适配器来获取视图。

ViewGroup v = (ViewGroup) adapter.getView(i, null, listView); 
for(int k = 0; k < v.getChildCount(); k++) { 
    View child = v.getChildAt(k); 
    child.setBackgroundColor(0xFFA6D2FF); 
} 
listView.invalidateViews(); 

我已经尝试设置包含文本项目的ViewGroup V(列表视图中的项目有子项目所以它的2个文本视图)。我也尝试设置可能正在工作的儿童背景,但看起来它们的界限是0。所以它可能正在工作,但即使您可以看到文字,孩子们也没有大小。

+0

给一个id行项目的根视图,并尝试通过设置背景。 – Chitrang 2014-11-06 04:40:06

+0

尝试在xml中设置背景列表项。 – 2014-11-06 04:40:14

+0

XML不是一个选项。 Chitrang,你是什么意思的行项目的根视图?你的意思是从getView返回的视图的根视图? – lostdev 2014-11-06 04:46:37

回答

1

更好地从定制的基础转接器更改项目的颜色创建以下方法:

private int[] colors; 

// In Constructor or whenever you get data 
colors = new int[sizeOfList]; 

private void setColors(int[] positions, int color) { 
    for (int pos : positions) { 
    colors[pos] = color; 
    } 
    notifyDataSetChanged(); 
} 

private void setColors(int position, int color) { 
    colors[pos] = color; 
    notifyDataSetChanged(); 
} 

public View getView(...) { 

    if (colors[position] != 0) { 

    child.setBackgroundColor(colors[position]); 

    } else { 

    child.setBackgroundColor(// default color); 

    } 

    return view; 

} 

希望它能帮助。我认为其他答案也建议你做同样的事情。 :)

+0

像魅力一样工作。谢谢! – lostdev 2014-11-06 05:29:40

0

如果我正确地理解了您的代码,您希望为背景颜色提供每个您在列表项中的视图。

如果你想这样做编程(不通过XML),我能想到的最简单的方法是创建一个自定义的适配器并设置holder(视图)背景颜色有。

当然,您可以通过XML轻松完成此操作。

有关更多信息,请参见本:http://www.vogella.com/tutorials/AndroidListView/article.html#tutorial_ownadapter

随意评论,如果你有一些问题,或者如果我想念你明白。

0

当您调用listView.invalidateViews();时,它将使用适配器的getView()方法并绘制视图。如果你想在ListView中改变视图的背景颜色,最好的地方应该是在你的适配器的getView()中完成。

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater) context 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View rowView = inflater.inflate(R.layout.rowlayout, parent, false); 
    rowView.setBackgroundColor(0xFFA6D2FF); 
    return rowView; 
    } 
+0

我该如何告诉列表适配器哪些应该在那里更新?这些项目可以通过用户交互进行更新。 – lostdev 2014-11-06 04:45:19

+0

如果convertView为null,您应该理想地夸大新视图。 – 2014-11-06 04:45:57

+0

您的模型中应该有一个与ListView绑定的称为背景颜色的字段。你可以改变模型,然后调用'notifyDatasetChanged()'强制ListView重绘。 – 2014-11-06 04:48:16

0

据我所知。这应该通过在自定义适配器的getView方法中创建自定义视图来完成。

公共类MyAdapter延伸BaseAdapter {

 public Activity activity; 
    ArrayList<String> data = new ArrayList<String>(); 
    private static LayoutInflater inflater = null; 

    public MyAdapter(Activity a, ArrayList<String> d) { 
     activity = a; 
     data = d; 
     inflater = LayoutInflater.from(activity); 
     }  

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     ViewHolder holder = null; 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.my_list_item, null); 
      holder = new ViewHolder(); 
      convertView.setTag(holder); 

     } else { 
      holder = (ViewHolder)convertView.getTag(); 
     } 

    convertView.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      //Touch on view handle 
     Log.d("", "Touched row "+position); 
     } 

    }); 

    //customizing view 
    holder.textView = (TextView)convertView.findViewById(R.id.my_textview); 
    holder.textView.setText(data.get(position)); 

    return convertView; 
}  

    public static class ViewHolder { 
    public TextView textView; 
    } 
@Override 
    public int getCount() { 
    return data.size(); 
    } 
@Override 
public Object getItem(int position) { 
    return position; 
} 
@Override 
public long getItemId(int position) { 
    return position; 
} 

}

Background each row in listview