我有一个ListFragment,我希望某些行是某种颜色。我基本上遵循了这个:Creating a ListView and setting the background color of a view in each row
但是,从不调用getView。有谁知道为什么?
public class TrackerFragment extends ListFragment
{
private String[] list;
@Override
public void onActivityCreated(Bundle myBundle)
{
super.onActivityCreated(myBundle);
list = null;
ListView lv = getListView();
setListAdapter(null);
setEmptyText("Touch a connection to view tracker information.");
lv.setTextFilterEnabled(true);
}
public void updateList(String[] list)
{
this.list = list;
setListAdapter(new ColoredArrayAdapter(getActivity(),R.layout.list_item,list));
}
}
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="7dp"
android:textSize="14sp"
android:id="@+id/line">
</TextView>
我正在从我的活动中更新这样的列表:
TrackerFragment tf = (TrackerFragment) fragmentManager.findFragmentById(R.id.tracker1);
tf.updateList(result);
My ColoredArrayAdapter
public class ColoredArrayAdapter extends ArrayAdapter{
private String[] list;
public ColoredArrayAdapter(Context context, int textViewResourceId,
Object[] objects) {
super(context, textViewResourceId, objects);
list = new String[objects.length];
for (int i = 0; i < list.length; i++)
list[i] = (String) objects[i];
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View vi = convertView;
ViewHolder holder;
if (convertView == null)
{
vi = LayoutInflater.from(getContext()).inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.line = (TextView) vi.findViewById(R.id.line);
vi.setTag(holder);
}
else
holder = (ViewHolder) vi.getTag();
for (int i = 0; i < list.length; i++)
{
if (list[i].contains("OUT OF LOCK"))
{
System.out.println("OUT OF LOCK");
holder.line.setText(list[i]);
//holder.line.setTextColor(R.color.white);
holder.line.setBackgroundResource(R.color.red);
}
else if(list[i].contains("IN LOCK"))
{
System.out.println("In LOCK");
holder.line.setText(list[i]);
//holder.line.setTextColor(R.color.white);
holder.line.setBackgroundResource(R.color.green);
}
else
holder.line.setText(list[i]);
}
return vi;
}
}
我做错了什么? 编辑:添加了list_item.xml,其中找到了行。 Edit2:添加了扩展数组适配器
现在我的问题是,当我只想要某些单独的行为红色或绿色时,每一行都是绿色或红色。此外,没有任何文字出现。
答案 0 :(得分:1)
您当前的getView
实施应移至ListAdapter
实施,而不是TrackerFragment
课程。由于您正在使用ArrayAdapter
,因此您可以将其子类化并将代码放在那里。 ArrayAdapter
已经实现getView
,但您将覆盖它以提供您的专业行为。
您获得NullPointerException的原因是因为您正在调用getView
并传入列表视图,该视图中没有与之关联的标记 - 因此holder = (ViewHolder) vi.getTag();
指定{{1}到null
。也就是说,你不应该直接打电话给holder
。只要需要显示列表项,系统就会为您调用。当系统调用getView
方法时,它最初会传入getView
以创建视图,而null
不是convertView
的每个调用都是由该方法创建的视图
答案 1 :(得分:0)
看起来与您链接的帖子相同的问题:getView()方法没有嵌套在类中。
或者您的代码没有显示任何可以调用它的内容。
答案 2 :(得分:0)
我越看越清楚,我就越想知道你使用的基本前提。我认为你让它变得过于复杂。我会这样做:
public View getView(View convertView)
{
View vi = convertView;
TextView viText = null;
if (vi == null)
vi = LayoutInflater.from(getActivity()).inflate(R.layout.list_item, null);
viText = (TextView)vi.findViewById(R.id.line);
if (viText == null) return vi;
String viString = viText.getText().toString();
if (viString.contains("OUT OF LOCK"))
{
viText.setBackgroundResource(R.color.red);
}
else if (viString.contains("IN LOCK"))
{
viText.setBackgroundResource(R.color.green);
}
return vi;
}
我认为你没有按照你想象的方式使用holder
...你在那里的循环只会循环设置后台资源到设置backgroundResource的最后一个触发器,无论如何。
如果我错过了这一点,请告诉我。但是,我的基本想法是尽可能地消除复杂性,直到它工作,如果你不得不删除重要的东西,慢慢地将它重新加入。