我有ListView
CustomAdapter
,我可以更改点击线的颜色。
但是我需要在用户要求答案时更改颜色(这是一个测验应用程序),并且我尝试设置一个公共方法来从我的MainActivity
调用它,但我得到了一个错误。
MyCustomAdapter代码:
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
// TODO Auto-generated method stub
final Holder holder=new Holder();
View rowView;
rowView = inflater.inflate(R.layout.row_item, null);
lista = parent;
holder.tv=(io.github.kexanie.library.MathView) rowView.findViewById(R.id.texto);
holder.row=(RelativeLayout) rowView.findViewById(R.id.row);
holder.img=(ImageView) rowView.findViewById(R.id.imagem);
holder.tv.setText(result[position]);
holder.img.setImageResource(imageId[position]);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
holder.tv.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else {
holder.tv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
holder.tv.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
holder.tv.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
rowView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Paint the clicked line, and remove color from the unclicked lines.
for (int j = 0; j < 5; j++) {
parent.getChildAt(j).setBackgroundResource(R.color.branco);
if (j != position) {
status[j] = false;
}
}
if(!status[position]) {
holder.row.setBackgroundResource(R.color.azul);
status[position] = true;
respostas = ((MyApplication) simulado.getApplication()).getRespostas();
mudarAlternativa(position);
}else{
holder.row.setBackgroundResource(R.color.branco);
status[position] = false;
mudarAlternativa(5);
}
}
});
return rowView;
}
要绘制一条线,我使用parent.getChildAt(position).setBackgroundResource(R.color.mycolor);
并且它有效,但我想用方法绘制它:
public void paintAnswer(int answerPosition){
parent.getChildAt(j).setBackgroundResource(R.color.green);
}
但我无法使用parent
,因此我初始化ViewGroup lista;
并在lista
上设置getView
。 lista = parent
。所以我试过了:
适配器上的公共方法:
public void paintAnswer(int answerPosition){
lista.getChildAt(j).setBackgroundResource(R.color.green);
}
从我的MainActivity调用:
adapter.paintAnswer(2);
我得到了一个错误。 “引起:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'android.view.View android.view.ViewGroup.getChildAt(int)'。”
我如何在parent
之外引用getView
来使用公共方法绘制线条?
答案 0 :(得分:0)
通过在onClick
- 侦听器中设置视图,您可以将逻辑带入视图本身,这种方法并不完全正确。它可以有意义,但只是为了节省资源,而不是更新整个列表。我也不会依赖parent
的子位置来获取特定视图,因为ListView
中的行的视图是可重用的,并且相同的视图可以表示不同的权限。
相反,将此逻辑放在getView
实现中,因此可重用的视图不必保持其状态。一个项目应该知道它的状态,并且在每次视图到达getView
- 方法时它都会相应地调整它自己的视图。