2017-04-25 121 views
-1

我有一個ListViewCustomAdapter,我可以改變點擊線的顏色。 但我需要改變顏色時,用戶要求的答案(這是一個測驗應用程序),我試圖設置一個公共的方法來調用它從我的MainActivity,但我得到了一個錯誤。如何在ListView android中更改特定的行/行顏色?

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;並在getView上設置listalista = 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)'在空對象引用上」。

我如何參考parentgetView以外使用公共方法繪製線條?

回答

0

通過在onClick -listener中設置視圖,將邏輯帶入視圖本身,這種方法並不完全正確。它是有道理的,但只是爲了節省資源,而不是更新整個列表。我也不會依賴parent的子級位置來獲得特定的視圖,因爲ListView中的行視圖是可重用的,並且相同的視圖可以表示不同的實體。

相反,把這個邏輯放在getView的實現中,所以可重用的視圖不必保持它們的狀態。一個項目應該知道它的狀態,並且將它說給視圖,以便它在每次視圖來到getView-方法時相應地進行調整。

+0

謝謝。我對這方面很瞭解,你能告訴我一個小例子嗎?一個鏈接,類似的問題等? –

+0

我對你所說的有所瞭解,而且我將ListView更改爲五個LinearLayout,並且它更容易操作。 –

+0

@GLAPPsMobile,如果你有一個固定數量的視圖,使用預定義的視圖集合而不是'ListView'是有意義的。 –

相關問題