如何在ListView android中更改特定的行/行颜色?

时间:2017-04-25 19:13:26

标签: java android listview adapter

我有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上设置getViewlista = 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来使用公共方法绘制线条?

1 个答案:

答案 0 :(得分:0)

通过在onClick - 侦听器中设置视图,您可以将逻辑带入视图本身,这种方法并不完全正确。它可以有意义,但只是为了节省资源,而不是更新整个列表。我也不会依赖parent的子位置来获取特定视图,因为ListView中的行的视图是可重用的,并且相同的视图可以表示不同的权限。

相反,将此逻辑放在getView实现中,因此可重用的视图不必保持其状态。一个项目应该知道它的状态,并且在每次视图到达getView - 方法时它都会相应地调整它自己的视图。