防止在触摸列表中的项目后进行多次触摸



我有一个带有列表视图的主活动,一个onItemClickListener()事件与列表视图相关联,当我触摸一个元素时,我会启动一个执行一些工作的AsyncTask。我想禁用用户在异步任务执行期间可以对列表的其他元素进行的其他触摸,并在异步任务结束时重新启用它们。我该怎么办?

这是我的活动

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener{
    private ListView newList;
    private ArrayAdapter<String> newArrayAdapter;
    private MyAsyncTask asyncTask;
    private ProgressBar progressBar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        progressBar = findViewById(R.id.progressbar);
        newArrayAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1);
        newList = findViewById(R.id.pairedDevicesListView);
        newList.setOnItemClickListener(this);
    }
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        newList.setOnItemClickListener(null); //need something like this
        asyncTask = new MyAsyncTask(this);
        asyncTask.execute();
    }
    @Override
    public void onBackPressed() {
        asyncTask.cancel(true);
        super.onBackPressed();
    }

    private class MyAsyncTask extends AsyncTask<Void,Void,Void>{
        Context context; 
        public MyAsyncTask(Context context){
            this.context = context.getApplicationContext();
        }
        @Override
        protected Void doInBackground(Void... voids) {
            // do some stuff
            return null;
        }
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            progressBar.setVisibility(View.GONE);
            newList.setOnItemClickListener();
            //does not work or I don't know what to pass
        }
    }
}

试试这个:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    if (asyncTask == null || asyncTask.getStatus() == AsyncTask.Status.FINISHED) {
        asyncTask = new MyAsyncTask(this);
        asyncTask.execute();
    }
}

小心onBackPressed,否则可能会在null对象上调用函数。

@Override
public void onBackPressed() {
    if (asyncTask != null) {
        asyncTask.cancel(true);
    }
    super.onBackPressed();
}

你可以在onItemClickListener中写这样的东西:

newList.setEnabled(false);

然后在你的onPostExecute方法中写:

newList.setEnabled(true);

最新更新