Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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
Java 带有子微调器的微调器未按预期工作_Java_Android_Android Layout_Spinner_Adapter - Fatal编程技术网

Java 带有子微调器的微调器未按预期工作

Java 带有子微调器的微调器未按预期工作,java,android,android-layout,spinner,adapter,Java,Android,Android Layout,Spinner,Adapter,我有两个,这样我的第二个微调器就可以根据在第一个微调器中选择的项目更改它可以提供的选项。容易吗 示例:如果在主微调器中选择“a”,则子微调器应显示“a1”作为选项。如果在主微调器中选择“b”,则子微调器应显示“b1”和“b2”作为选项。如果在主微调器中选择“c”,则子微调器应显示“c1”、“c2”、“c3”作为选项 我使用一个名为的库,但这并不重要,因为它就像Android spinner一样工作 公共类事后投诉活动{ String[]problems_main={“a”、“b”、“c”}; 字

我有两个,这样我的第二个微调器就可以根据在第一个微调器中选择的项目更改它可以提供的选项。容易吗

示例:如果在主微调器中选择“a”,则子微调器应显示“a1”作为选项。如果在主微调器中选择“b”,则子微调器应显示“b1”和“b2”作为选项。如果在主微调器中选择“c”,则子微调器应显示“c1”、“c2”、“c3”作为选项

我使用一个名为的库,但这并不重要,因为它就像Android spinner一样工作

公共类事后投诉活动{
String[]problems_main={“a”、“b”、“c”};
字符串[][]问题_sub={{“a1”}、{“b1”、“b2”}、{“c1”、“c2”、“c3”};
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u post\u投诉);
spinner_main=(SearchableSpinner)findViewById(R.id.spinner_main);
spinner\u sub=(SearchableSpinner)findViewById(R.id.spinner\u sub);
ArrayAdapter spinnerAdapter=新的ArrayAdapter(这个,android.R.layout.simple\u spinner\u项,problems\u main);
spinnerAdapter.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
spinner_main.setAdapter(旋转适配器);
spinnerAdapter.notifyDataSetChanged();
微调器_main.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
设置下旋器(位置);
}
@凌驾
未选择公共无效(AdapterView父级){
Toast.makeText(PostComplaint.this,“未选择任何内容”,Toast.LENGTH_SHORT.show();
}
});
}
void setSubSpinner(int i){
String[]myArray=problems_sub[i];//注意:problems_sub是一个二维数组
ArrayAdapter spinnerAdapter_sub=新的ArrayAdapter(这是android.R.layout.simple_spinner_项,myArray);
spinnerAdapter\u sub.setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
微调器接头设置适配器(微调器接头);
spinnerAdapter_sub.notifyDataSetChanged();
}
问题:无论我第一次单击主微调器的哪个项目,都会根据子微调器已被选中。如果我更改主微调器,则子微调器不会更改。


该问题可供建议。如果不可理解,请进行评论。

由于SearchableSpinner类中的以下函数而出现错误:

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        ArrayAdapter adapter = (ArrayAdapter) getAdapter();

        if (null != adapter) {

            if (_items.size() == 0) {
                for (int i = 0; i < adapter.getCount(); i++) {
                    _items.add(adapter.getItem(i));
                }
            }
            SearchableListDialog searchableListDialog = SearchableListDialog.newInstance
                    (_items);
            searchableListDialog.setOnSearchableItemClickListener(this);
            searchableListDialog.show(((Activity) _context).getFragmentManager(), "TAG");
        }
    }
    return true;
}
另外,请更新布局文件和PostComplaint类,以使用CustomSearchableSpinner代替SearchableSpinner。这可能不是最好的方法,但它确实有效

编辑2


调用
spinnerAdapter\u sub.notifyDataChanged(true)
后,需要调用
spinnerAdapter\u sub.notifyDataSetChanged();

尝试使用第一个invalidateDataSet,然后添加again@VivekMishra你的意思是
spinner\u sub.invalidatedastatset()
?是这样的,因为其中的数据是根据旧的微调器生成的。首先删除该数据,然后添加新数据one@VivekMishra没有像
invalidatedastatset()
这样的方法。我尝试了
spinner\u sub.invalidate();
作为方法
setSubSpinner()中的第一行
。还没有帮助。坦率地说,我很难亲自动手解决问题,但我确实想尝试一下。这将是我第一次动手解决问题。如果可以,请给我任何其他提示。我感谢你的努力。哦,这应该行得通。但在我尝试之前,你应该得到一个巨大的感谢。21小时我们的任务是提供赏金。耐心。很高兴我能帮上忙:)嘿,如果我正确理解了你的代码,你没有错过if(isDataSetChanged)的另一部分吗?您需要将
for
循环放置在何处以添加内容?不,在这种情况下,它将显示先前创建的列表,而不会再次填充项目。但是,我忘记了提及一些内容。我已再次更新了我的答案。
@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        ArrayAdapter adapter = (ArrayAdapter) getAdapter();

        if (null != adapter) {

            if (_items.size() == 0) {
                for (int i = 0; i < adapter.getCount(); i++) {
                    _items.add(adapter.getItem(i));
                }
            }
            SearchableListDialog searchableListDialog = SearchableListDialog.newInstance
                    (_items);
            searchableListDialog.setOnSearchableItemClickListener(this);
            searchableListDialog.show(((Activity) _context).getFragmentManager(), "TAG");
        }
    }
    return true;
}
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

import com.toptoche.searchablespinnerlibrary.SearchableListDialog;

import java.util.ArrayList;
import java.util.List;

public class CustomSearchableSpinner extends Spinner implements View.OnTouchListener,
    SearchableListDialog.SearchableItem {

private Context _context;
private List _items;
private boolean isDataSetChanged;

public CustomSearchableSpinner(Context context) {
    super(context);
    this._context = context;
    this.isDataSetChanged = true;
    init();
}

public CustomSearchableSpinner(Context context, AttributeSet attrs) {
    super(context, attrs);
    this._context = context;
    this.isDataSetChanged = true;
    init();
}

public CustomSearchableSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    this._context = context;
    this.isDataSetChanged = true;
    init();
}

private void init() {
    _items = new ArrayList();
    setOnTouchListener(this);
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        ArrayAdapter adapter = (ArrayAdapter) getAdapter();

        if (null != adapter) {

            if (isDataSetChanged) {
                if(_items.size() != 0) {
                    _items = new ArrayList();
                }
                for (int i = 0; i < adapter.getCount(); i++) {
                    _items.add(adapter.getItem(i));
                }
                isDataSetChanged = false;
            }
            SearchableListDialog searchableListDialog = SearchableListDialog.newInstance
                    (_items);
            searchableListDialog.setOnSearchableItemClickListener(this);
            searchableListDialog.show(((Activity) _context).getFragmentManager(), "TAG");
        }
    }
    return true;
}

@Override
public void onSearchableItemClicked(Object item, int position) {
    setSelection(_items.indexOf(item));
}

public void notifyDataChanged(Boolean hasDataChanged) {
    this.isDataSetChanged = hasDataChanged;
}
}