如何从异步任务更改列表视图行的颜色?

时间:2016-12-26 21:39:36

标签: android listview android-asynctask android-arrayadapter

我正在使用异步任务,我想两次更改每行的颜色,

1.我想在开始长时间运行的任务之前更改行的颜色

2.我希望在完成长时间运行的任务后更改行的颜色

1.和2.都来自doinBackground。

这是我的适配器:

    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,al);
    listView.setAdapter(arrayAdapter);

这是我的异步任务

class AT extends AsyncTask<List<String>,Void,Void>{

    @Override
    protected Void doInBackground(List<String>... list) {

        for(int i=0;i<n;i++){
     //iterating my list , so that for every item of my list,i am performing  my long running task and changing the color of rach row

                final int t=i;
        //trying to change the associate row color before starting my task        
            handler.post(new Runnable() {
                @Override
                public void run(){
                Log.d("sri","listView.performItemClick;");
                 listView.performItemClick(listView.getAdapter().getView(t,null,listView),t,t);
                }});


            try {
                Thread.sleep(5000);
                Log.d("TAG","doInBackground =====> Thread.sleep(5000);");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //my long running task would be here

            try {
                Thread.sleep(3000);
                Log.d("sri","doInBackground =====> Thread.sleep(3000);");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

      //trying to change the associate row color after completing my task        
            handler.post(new Runnable() {
                @Override
                public void run(){
                Log.d("sri","listView.performItemClick;");
                 listView.performItemClick(listView.getAdapter().getView(t,null,listView),t,t);
                }});


        }

        return null;
    }}

这是onItemClick代码:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            Log.d("TAG","onItemClick --> pos is " + i + "-->id is " + l );

            view.setBackgroundColor(Color.parseColor("#1234ab"));
            //adapterView.getChildAt(i-adapterView.getFirstVisiblePosition()).setBackgroundColor(Color.BLUE);

            Log.d("TAG","onItemClick --> pos is " + i + "-->id is " + l );
        }
    });

我的问题是

* listView.performItemClick调用OnItemClick代码* 变量pos和id是正确的) ,但 的 view.setBackgroundColor(Color.parseColor( “#1234ab”));没有效果,所以颜色没有变化。

2 个答案:

答案 0 :(得分:0)

试试这个:

listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adpterView, View view, int position,
                long id) {
                    listView.getChildAt(i).setBackgroundColor(Color.BLUE);     
            }
        }
    });   

答案 1 :(得分:0)

你不能这样做,只要用户滚动,改变就会丢失。您可以做的是将项目标记为在数组中选择并且notifydatasetChanged并在您的适配器中进行检查,或者一个简单的替代方法是将项目设置为选中,如此处所述(https://stackoverflow.com/a/10791326/2418640)。