假设我们有基本文本项的ListView:
package cz.nanuq.test
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Init listView
val listView = findViewById<ListView>(R.id.listView)
var values : Array<String> = arrayOf("foo", "bar", "baz", "boo")
var adapter : ArrayAdapter<String> = ArrayAdapter(this, android.R.layout.simple_list_item_1, values)
listView.setAdapter(adapter)
// Change background color of one listView item
var index : Int = 2 // can change dynamically
var bgColor : String = '#123456' // can change dynamically
//...how?
}
}
现在,我要将索引2的项目的背景色更改为“#123456”。
该怎么做?
P.S。对于这个简单的任务,我正在寻找简单的解决方案。像这样:
listView.getItem(index).setAttribute("background", bgColor)
基本上,我只需要访问ListView的子组件并更改其属性。
答案 0 :(得分:0)
如果只想更改Listview文本部分的颜色,则可以从以下代码中寻求帮助:
public class MainActivity extends Activity {
ListView listView;
String[] listValue = new String[]
{
"ONE",
"TWO",
"THREE",
"FOUR",
"FIVE",
"SIX"
};
List<String> LISTSTRING;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView)findViewById(R.id.listView1);
LISTSTRING = new ArrayList<String>(Arrays.asList(listValue));
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_2, android.R.id.text1, LISTSTRING){
@Override
public View getView(int position, View convertView, ViewGroup parent){
View view = super.getView(position, convertView, parent);
TextView ListItemShow = (TextView) view.findViewById(android.R.id.text1);
ListItemShow.setTextColor(Color.parseColor("#fe00fb"));
return view;
}
};
listView.setAdapter(adapter);
}
}
如果要在单击时更改列表视图的背景色,则可以参考第二段代码:
private static int save = -1;
public void onListItemClick(ListView parent, View v, int position, long id) {
parent.getChildAt(position).setBackgroundColor(Color.BLUE);
if (save != -1 && save != position){
parent.getChildAt(save).setBackgroundColor(Color.BLACK);
}
save = position;
}
最后,如果您想在开始时更改颜色,则此代码将有所帮助:
final ListView lv = (ListView)findViewById(R.id.lv);
lv.setAdapter(new BaseAdapter()
{
public View getView(int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = new TextView(ListHighlightTestActivity.this);
convertView.setPadding(10, 10, 10, 10);
((TextView)convertView).setTextColor(Color.WHITE);
}
convertView.setBackgroundColor((position == curSelected) ?
Color.argb(0x80, 0x20, 0xa0, 0x40) : Color.argb(0, 0, 0, 0));
((TextView)convertView).setText((String)getItem(position));
return convertView;
}
public long getItemId(int position)
{
return position;
}
public Object getItem(int position)
{
return "item " + position;
}
public int getCount()
{
return 20;
}
});
希望,以上3个代码之一将为您提供帮助。 :)
注意上面提到的代码并不完全符合您的要求,但我希望它能为您提供指导。
答案 1 :(得分:0)
我只是使用了问题代码,并获得了预期的结果。这绝对是最简单的方法。我们可以实现适配器并根据需要更改视图。请尝试以下代码。
import android.graphics.Color
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ListView
import android.widget.TextView
class MainActivity : AppCompatActivity() {
private val values: Array<String> = arrayOf("foo", "bar", "baz", "boo")
// Change background color of one listView item
private var index: Int = 0 // can change dynamically®
private var bgColor: String = "#ffffff" // can change dynamically
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Init listView
val listView: ListView = findViewById(R.id.listView)
val adapter: ArrayAdapter<String> =
object : ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val v = super.getView(position, convertView, parent)
val tv = v.findViewById<TextView>(android.R.id.text1)
if (index == position) {
tv.setBackgroundColor(Color.parseColor(bgColor))
tv.setTextColor(Color.WHITE)
} else {
tv.setBackgroundColor(Color.TRANSPARENT)
tv.setTextColor(Color.BLACK)
}
return v
}
}
listView.adapter = adapter
// For -- Explanation / testing purpose, I used handler here.
update(adapter)
}
private fun update(adapter: ArrayAdapter<String>) {
// For -- Explanation / testing purpose, I used handler here.
Handler().postDelayed({
index = 0
bgColor = "#123456"
adapter.notifyDataSetChanged()
}, 1000)
Handler().postDelayed({
index = 1
bgColor = "#c544fc"
adapter.notifyDataSetChanged()
}, 2000)
Handler().postDelayed({
index = 2
bgColor = "#123456"
adapter.notifyDataSetChanged()
}, 3000)
Handler().postDelayed({
index = 3
bgColor = "#c544fc"
adapter.notifyDataSetChanged()
// For -- Explanation / testing purpose, (REPEATING / LOOPING).
update(adapter)
}, 4000)
}
}
结果如下。快乐编码:)
答案 2 :(得分:0)
如果要更改特定项目的背景颜色,则需要在CustomAdapter类的 onBindViewHolder 方法中进行设置。这是我设置recyclerview的第五项的代码。
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
ProfileDetails profileDetails = profileDetailsList.get(position);
holder.icon.setImageResource(profileDetails.getIcon());
holder.label.setText(profileDetails.getLabel());
holder.details.setText(profileDetails.getDetail());
if(position == 4)
{
holder.details.setMaxLines(3);
holder.itemView.setBackgroundColor(R.drawable.btn_border);
holder.details.setMinHeight(90);
holder.itemView.setMinimumHeight(90);
holder.itemView.setPadding(0,20,0,50);
}
}
holder.details.setMaxLines(3)是我的代码,用于以编程方式设置第五项TextView的maxLines。其他textView的maxLines设置为1。
holder.itemView.setBackgroundColor(R.drawable.btn_border); 是我设置第五项背景的代码。请注意,您需要为颜色创建一个可绘制的。如果仅从color.xml设置颜色,则此方法将无效。
holder.itemView.setMinimumHeight(90); 是我的代码,用于操纵TextView和 holder.itemView.setPadding(0,20,0,50); > strong>用于左填充,上填充,右填充和bototm。
有关最终输出,请参考以下屏幕截图。