Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 故障同步滤波器_Android_Filter_Android Alertdialog_Android Adapter - Fatal编程技术网

Android 故障同步滤波器

Android 故障同步滤波器,android,filter,android-alertdialog,android-adapter,Android,Filter,Android Alertdialog,Android Adapter,我已经实现了几种过滤器类型,当我在警报对话框(多选)中选择它们时,它们工作正常,并且我将此选择保存以备将来使用,即如果我再次打开应用程序,但在这种情况下,它只工作最后一个过滤器 外观看起来像这样 private void initializeFilterButton(final Button filter_button, final String filter_criterium, final int pos) { // First we check whether buttons c

我已经实现了几种
过滤器
类型,当我在
警报对话框
(多选)中选择它们时,它们工作正常,并且我将此选择保存以备将来使用,即如果我再次打开应用程序,但在这种情况下,它只工作最后一个过滤器

外观看起来像这样

private void initializeFilterButton(final Button filter_button, final String filter_criterium, final int pos) {

    // First we check whether buttons can be initialized via SharedPreferences - selected


    if ( selected != null ){
        filter_button.setVisibility(selected[pos] ? View.VISIBLE : View.GONE);
        if (selected[pos]) {

            myFarmAdapter.getFilter().filter(filter_criterium, this);           
        } else {
            // Neccessary if the filter is disabled in order to fire FilterListener onFilterComplete. That's a NO Filter Operation
            myFarmAdapter.getFilter().filter("", this);         
        }
        // To ensure, we initialize this button.
        initialisedButtons[pos] = true;
    }


    filter_button.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {                
            // Unset Filter Type F1 is the same like filter the original Data with the other Filters (if present) 
        myFarmAdapter.getFilter().filter(Constants._REMOVE_CRITERIUM+filter_criterium);
            filter_button.setVisibility(View.GONE);
            selected[pos] = false;
            settings.put(Constants._SELECTED_CRITERIA, Arrays.toString(selected));              
            session.createOrUpdateSettings(settings);
    }});    
}

选定的标准会被很好地保存,并且
AlertDialog
中的选择会反映在中间筛选按钮(作物年…和作物类型)中,单击这些按钮也会删除筛选标准反映的内容,因此我在这里问,因为,当我单击/标记一个选项时,
AlertDialog
中的另一个选项是可用于下一次筛选/取消筛选操作的筛选数据

当我想用以前选择的条件初始化元素时(如上所述,它们是正确的),就会发生异常

我试图在这两个过滤器之间引入延迟,以便第一个过滤器的过滤数据可以作为第二个过滤器的输入,但我得到了相同的结果

相关代码在这里

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);     
    setContentView(R.layout.farm_fields_list);
    // Get SharedPreferences
    session = new SessionManager(getApplicationContext()); 


    selected = getSelectedCriteria();

    ...



    // Retrieve Session
     session                 = new SessionManager(getApplicationContext()); 
     Log.i("TAG", "FarmListActivity::onCreate:: 1");
    // Get the Parameter
    Intent intent            = getIntent();

    Bundle bundle            = intent.getExtras();

    if ( bundle != null) {
        farms                = (ArrayList<Object>)bundle.get(Constants.FARMS);      
    }

    farm_field_exp_list_view.setDividerHeight(2);
    farm_field_exp_list_view.setGroupIndicator(null);
    farm_field_exp_list_view.setClickable(true);


    /** Adapter initialisieren **/
    myFarmAdapter = new MyFarmAdapter(FarmListActivity.this, farms, mapView);

    farm_field_exp_list_view.setAdapter(myFarmAdapter);     



    /** Filter Buttons initialisieren **/
    initializeFilterButton(crop_type_button, Constants._CROP_TYPE_MAIS_CRITERIUM, 0); // <- At this point
    initializeFilterButton(crop_year_button, Constants._CROP_YEAR_2015_CRITERIUM, 1);


    /**         **/     

    // Button
    show_fields_button = (Button) findViewById(R.id.show_map_btn);
    show_fields_button.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {

            // We'll pass as parameter an ArrayList of field_guids, whose fields will be shown
            ArrayList<String> selectedFields = myFarmAdapter.getSelectedFields();
            Intent intent = new Intent();
            intent.putExtra(Constants.SELECTED_FIELDS, selectedFields);

            // --------------------------
            activity.setResult(Activity.RESULT_OK, intent);
            activity.finish();              

        }

    });
    //

}

private void initializeFilterButton(final Button filter_button, final String filter_criterium, final int pos) {

    // First we check whether buttons can be initialized via SharedPreferences - selected


    if ( selected != null ){
        filter_button.setVisibility(selected[pos] ? View.VISIBLE : View.GONE);
        if (selected[pos]) {
            myFarmAdapter.getFilter().filter(filter_criterium);
        }

    }

    // I we click, then we remove the filter
    filter_button.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {                
            // Unset Filter Type F1 is the same like filter the original Data with the other Filters (if present) 

            myFarmAdapter.getFilter().filter(Constants._REMOVE_CRITERIUM+filter_criterium);
            filter_button.setVisibility(View.GONE);
            selected[pos] = false;
            settings.put(Constants._SELECTED_CRITERIA, Arrays.toString(selected));

            session.createOrUpdateSettings(settings);


    }});    

}

@Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        // action with ID action_filter was selected
        case R.id.action_filter: 
            Dialogs.showFilterDialog(this, session, myFarmAdapter, appliedFilterTV, crop_year_button, crop_type_button);
            //Toast.makeText(this, "Filter selected", Toast.LENGTH_LONG).show();
        break;
        default:
        break;
    }

    return true;
  }
最后我的日志

02-17 11:30:49.694: I/TAG(10211): FarmListActivity::initializeFilterButton::BEGIN filter_criterium: Year(Current Year: 2015) pos: 1 selected: [true, true]
02-17 11:30:49.694: I/TAG(10211): FarmListActivity::initializeFilterButton::if (selected[pos]) {
02-17 11:30:49.696: I/TAG(10211): MyFarmAdapter::getFilter:: fieldFilter: com.nutiteq.advancedmap.MyFarmAdapter$FieldFilter@ebe6c48
02-17 11:30:49.699: I/TAG(10211): FieldFilter::performFiltering:: constraint: [Year(Current Year: 2015)] constraintsList: []
02-17 11:30:49.699: I/TAG(10211): FarmListActivity::initializeFilterButton::END filter_criterium: Year(Current Year: 2015) pos: 1 selected: [true, true]
02-17 11:30:49.699: I/TAG(10211): FieldFilter::performFiltering:: constraint: [Year(Current Year: 2015)] #fields of filteredItems: 35 #fields of parentItems: 35
02-17 11:30:49.699: I/TAG(10211): FarmListActivity::initializeFilterButton::BEGIN filter_criterium: Crop(Current Crop: Mais) pos: 0 selected: [true, true]
02-17 11:30:49.699: I/TAG(10211): FarmListActivity::initializeFilterButton::if (selected[pos]) {
02-17 11:30:49.699: I/TAG(10211): MyFarmAdapter::getFilter:: fieldFilter: com.nutiteq.advancedmap.MyFarmAdapter$FieldFilter@ebe6c48
02-17 11:30:49.699: I/TAG(10211): FarmListActivity::initializeFilterButton::END filter_criterium: Crop(Current Crop: Mais) pos: 0 selected: [true, true]
02-17 11:30:49.699: I/TAG(10211): MyFarmAdapter::FieldFilter::filterByCropYear:: crop_year: 2015
02-17 11:30:49.700: I/TAG(10211): MyFarmAdapter::FieldFilter::filterByCropYear::fields.size: 35
02-17 11:30:49.700: I/TAG(10211): FieldFilter::performFiltering:: AFTER filtering:: constraint: Year(Current Year: 2015) #fields of filteredItems: 35 #fields of parentItems: 35
02-17 11:30:49.700: I/TAG(10211): FieldFilter::performFiltering:: constraint: [Crop(Current Crop: Mais)] constraintsList: [Year(Current Year: 2015)]
02-17 11:30:49.700: I/TAG(10211): FieldFilter::performFiltering:: constraint: [Crop(Current Crop: Mais)] #fields of filteredItems: 35 #fields of parentItems: 35
02-17 11:30:49.704: I/TAG(10211): MyFarmAdapter::FieldFilter::filterByCropTypeName::fields.size: 35
02-17 11:30:49.704: I/TAG(10211): FieldFilter::performFiltering:: AFTER filtering:: constraint: Crop(Current Crop: Mais) #fields of filteredItems: 35 #fields of parentItems: 35
02-17 11:30:49.771: I/TAG(10211): FieldFilter::publishResults:: constraint: Year(Current Year: 2015) #fields of filteredItems: 11 #fields of parentItems: 35
02-17 11:30:49.772: I/TAG(10211): FieldFilter::publishResults:: constraint: Crop(Current Crop: Mais) #fields of filteredItems: 10 #fields of parentItems: 35
正如您在日志文件中看到的,
publishResults
Methods设置数据太晚了,我不知道如何在没有dellegated事件的情况下解决问题,必须有一个更简单的解决方案

如果出现
警报对话框
我可以记录它,正确的顺序如下所示

1. performFiltering of first Filter
2. publishResults of first Filter
3. performFiltering of second Filter
4. publishResults of second Filter
@Override
public void onFilterComplete(int count) {

    if ( ! isTrue(initialisedButtons) ) 
        initializeFilterButton(crop_year_button, Constants._CROP_YEAR_2015_CRITERIUM, 1);

}

private boolean isTrue(boolean[] initialisedButtons) {
    // TODO Auto-generated method stub
    boolean result = true;

    if ( initialisedButtons != null && initialisedButtons.length>0 ) {
        for ( int i = 0; i<initialisedButtons.length && result; i++)
            result = result && initialisedButtons[i];
    } else
        result = false;

    return result;
}

我可以解决它,正如我对@Luksprog所说的,我在我的活动中实现了
FilterListener
接口的方法,在这种情况下
public void onFilterComplete(int count)
,如下所示

1. performFiltering of first Filter
2. publishResults of first Filter
3. performFiltering of second Filter
4. publishResults of second Filter
@Override
public void onFilterComplete(int count) {

    if ( ! isTrue(initialisedButtons) ) 
        initializeFilterButton(crop_year_button, Constants._CROP_YEAR_2015_CRITERIUM, 1);

}

private boolean isTrue(boolean[] initialisedButtons) {
    // TODO Auto-generated method stub
    boolean result = true;

    if ( initialisedButtons != null && initialisedButtons.length>0 ) {
        for ( int i = 0; i<initialisedButtons.length && result; i++)
            result = result && initialisedButtons[i];
    } else
        result = false;

    return result;
}
然后像这样修改
初始化过滤器按钮

private void initializeFilterButton(final Button filter_button, final String filter_criterium, final int pos) {

    // First we check whether buttons can be initialized via SharedPreferences - selected


    if ( selected != null ){
        filter_button.setVisibility(selected[pos] ? View.VISIBLE : View.GONE);
        if (selected[pos]) {

            myFarmAdapter.getFilter().filter(filter_criterium, this);           
        } else {
            // Neccessary if the filter is disabled in order to fire FilterListener onFilterComplete. That's a NO Filter Operation
            myFarmAdapter.getFilter().filter("", this);         
        }
        // To ensure, we initialize this button.
        initialisedButtons[pos] = true;
    }


    filter_button.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {                
            // Unset Filter Type F1 is the same like filter the original Data with the other Filters (if present) 
        myFarmAdapter.getFilter().filter(Constants._REMOVE_CRITERIUM+filter_criterium);
            filter_button.setVisibility(View.GONE);
            selected[pos] = false;
            settings.put(Constants._SELECTED_CRITERIA, Arrays.toString(selected));              
            session.createOrUpdateSettings(settings);
    }});    
}

就像这样,我们可以按顺序执行多个过滤器操作

您的问题有点含糊不清,但您不应该像在对话框中那样在onCreate中连接过滤器吗?如果您调用initializeFilterButton()两次,您只会在最后一次调用后才结束筛选,这不是很正常吗?我发现另一个使用FilterListener调用的
filter()
,我必须在那里实现
onFilterComplete
方法。当我实施时,我告诉你。顺便说一下,在警报对话框中选择单个过滤器时,过滤器的串联工作正常。Luks,我将过滤器状态保存在SharedReferences中,并在每次初始化此活动时加载它们,因此我也从对话框和onCreate执行此过滤器操作。