Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ListView设置项目背景_Android_Android Listview_Android Adapter - Fatal编程技术网

Android ListView设置项目背景

Android ListView设置项目背景,android,android-listview,android-adapter,Android,Android Listview,Android Adapter,我似乎不知道如何使一个或多个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.invali

我似乎不知道如何使一个或多个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=(ViewGroup)adapter.getView(i,null,listView);
for(int k=0;k

我尝试设置包含文本项的视图组v(列表视图项有子项,因此它是两个文本视图)。我也尝试过设置孩子的背景,这可能是可行的,但似乎他们的界限是0的。因此,它可能会起作用,但即使您可以看到文本,孩子们也没有大小。

如果我正确理解了您的代码,您希望为列表项中的每个视图指定背景色

如果您想通过编程方式(而不是通过XML)实现这一点,我认为最简单的方法是创建一个自定义适配器,并在那里设置
支架
(视图)的背景色

当然,从XML可以很容易地做到这一点

有关更多信息,请参见此:


如果您有问题或我想了解您,请随时发表意见。

当您调用
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;
  }

最好从自定义基本适配器更改项的颜色创建以下方法:

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;

}

希望能有帮助。我认为其他答案也建议你这样做。:)

据我所知。这应该通过在自定义适配器的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;
}
公共活动;
ArrayList数据=新的ArrayList();
专用静态充气机=空;
公共MyAdapter(活动a,ArrayList d){
活动=a;
数据=d;
充气机=从(活动)开始的充气机;
}    
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
ViewHolder=null;
if(convertView==null){
convertView=充气机。充气(R.layout.my_列表项,空);
holder=新的ViewHolder();
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//触摸视图手柄
Log.d(“,”接触行“+位置);
}
});
//自定义视图
holder.textView=(textView)convertView.findViewById(R.id.my_textView);
holder.textView.setText(data.get(position));
返回视图;
}       
公共静态类视图持有者{
公共文本视图文本视图;
}
@凌驾
public int getCount(){
返回data.size();
}
@凌驾
公共对象getItem(int位置){
返回位置;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
}


为行项目的根视图提供一个id,并尝试通过该id设置背景。尝试在xml中设置背景列表项目。xml不是一个选项。Chitrang,行项目的根视图是什么意思?您是指从getView返回的视图的根视图吗?我如何告诉列表适配器哪些应该在那里更新?这些项目可以通过用户交互进行更新。如果convertView为空,则理想情况下,您应该扩展新视图。您的模型中应该有一个名为background color的字段,该字段与ListView绑定。您可以更改模型,然后调用
notifyDatasetChanged()
以强制ListView重新绘制。效果非常好。谢谢