以编程方式更改ListView项的背景色

时间:2019-02-18 06:56:55

标签: android kotlin

假设我们有基本文本项的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的子组件并更改其属性。

3 个答案:

答案 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)
    }
}

结果如下。快乐编码:)

Divakar Murugesh's Answer

答案 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。

有关最终输出,请参考以下屏幕截图。

RecyclerView