2017-11-18 8 views
0

ArrayAdapterでListViewを使用していて、ユーザーがクリックしたときにTextView内のテキストの色を変更したいとします。これは、1つのTextViewの色が変わって別の1つの色がさらに色が変わる場合を除いて、問題なく動作します。ArrayAdapterで生成されたTextViewのテキストの色を変更する方法

これは、ビューを再利用するArrayAdapterと何か関係がありますか?

ArrayAdapter<String> adapter = new ArrayAdapter<> (thisContext, R.layout.textview_1, arrayList); 
listView.setAdapter (adapter); 

listView.setOnItemClickListener (new AdapterView.OnItemClickListener() 
{ 
    @Override 
    public void onItemClick (AdapterView<?> parent, View view, int position, long id) 
    { 
     TextView textToChange = (TextView) view; 
     textToChange.setTextColor (Color.RED); 
    } 
}); 
+0

あなたがやっている...考慮 'position'を取る必要があります'view'全体の変更。 – DigitalNinja

答えて

1

これはArrayAdapter再利用景色とは何かを持っていますか?

はい。

は、あなたは、あなたのArrayAdapterを作成するときに、このような何かを行うことによって、getView()をオーバーライドすることによってこの問題を解決することができます:あなたが実際にそれがどのような行動したいに依存します解いて行く方法

ArrayAdapter<String> adapter = new ArrayAdapter<String>(thisContext, R.layout.textview_1, arrayList) { 

    @NonNull 
    @Override 
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
     // TODO 
    } 
}; 

。アイテムビューはTextView sが実際にあるように思えるので、あなたはこのようなものでTODOを置き換えることができます:

TextView tv = (TextView) super.getView(position, convertView, parent); 
tv.setTextColor(Color.BLACK); 
return tv; 

は、任意のリサイクルビューが黒のテキストを持っていることを確認しますが、それはまた意味します、あなたがクリックした場合、その(赤色に変わります)、行をスクロールして表示外にスクロールして表示に戻すと、黒に戻ります。

おそらく、あなたがあなたのOnItemClickListenerの中からあなたの最後のクリックした位置を格納する変数を更新し、getView()にすることを参照することができます:

TextView tv = (TextView) super.getView(position, convertView, parent); 
tv.setTextColor(position == lastClickedPosition ? Color.RED : Color.BLACK); 
return tv; 
関連する問題