【问题标题】:How to change color of a listview row from async task?如何从异步任务更改列表视图行的颜色?
【发布时间】:2016-12-26 21:39:36
【问题描述】:

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

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;
    }}

这是onItem点击代码:

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"));没有效果,所以颜色没有变化。

【问题讨论】:

  • 不要从 AsyncTask 更新 ListView UI。更新适配器内的数据,让适配器相应地设置背景

标签: android listview android-asynctask android-arrayadapter


【解决方案1】:

试试这个:

listView.setOnItemClickListener(new OnItemClickListener() {

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-28
      • 2011-09-26
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多