2016-03-15 52 views
4

我有兩個spinners,這樣我的第二個微調的變化,它可以根據第一微調選擇的項目提供選項。簡單?微調與子微調工作不正常

例如:如果我選擇「一」主微調,副微調應顯示「A1」的選項。如果我在主微調器中選擇'b',子微調器應該顯示'b1','b2'作爲選項。如果我在主微調器中選擇'c',子微調器應該顯示'c1','c2','c3'作爲選項。

我使用了一個名爲SearchableSpinner庫,但沒有關係,因爲它的工作原理就像Android的微調。

public class PostComplaint extends AppCompatActivity { 
    String[] problems_main = {"a","b","c"}; 
    String[][] problems_sub = {{"a1"},{"b1","b2"},{"c1","c2","c3"}}; 

    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_post_complaint); 

    spinner_main = (SearchableSpinner)findViewById(R.id.spinner_main); 
    spinner_sub = (SearchableSpinner) findViewById(R.id.spinner_sub); 

    ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, problems_main); 
    spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner_main.setAdapter(spinnerAdapter); 
    spinnerAdapter.notifyDataSetChanged(); 

    spinner_main.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      setSubSpinner(position); 
     } 
     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
      Toast.makeText(PostComplaint.this, "Nothing selected", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

void setSubSpinner(int i){ 
    String[] myArray = problems_sub[i]; //Note: problems_sub is a two dimensional array 
    ArrayAdapter<String> spinnerAdapter_sub = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, myArray); 
    spinnerAdapter_sub.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner_sub.setAdapter(spinnerAdapter_sub); 
    spinnerAdapter_sub.notifyDataSetChanged(); 
} 

問題:無論項目I點擊首次主旋轉器,根據該副旋轉器被選擇。然後如果我改變主旋轉器,副旋轉器不會改變。

的問題是開放的建議。評論是否不可理解。

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

僅在第一次你點擊子微調的條件if(_items.size() == 0)爲真,因此它得到正確初始化你會:

+0

試着用這首invalidateDataSet,然後再添加 –

+0

@VivekMishra你的意思是'spinner_sub.invalidateDataSet()'? –

+0

是的,因爲它的數據是根據舊的微調。你首先刪除那些數據,然後添加新的數據 –

回答

1

這個錯誤是因爲在SearchableSpinner類具有以下功能的未來看到正確的值。但是,一旦您點擊了子微調器,_item.size()將永遠不會爲零,因此,永遠不會呈現更新的子微調器值。

我建議你使用默認的Android微調或叉子庫和修復錯誤,並使用相同。

編輯

您可以嘗試使用這個類:

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

此外,更新您的佈局文件和PostComplaint類代替檢索微調的使用CustomSearchableSpinner。這可能不是最好的方法,但它有效。

EDIT 2

您需要調用spinnerAdapter_sub.notifyDataChanged(true)你打電話spinnerAdapter_sub.notifyDataSetChanged();後。

+0

老實說,我自己很難分手解決這個問題,但我想嘗試一下。這將是我第一次分叉解決問題。如果可以的話,請給我任何其他提示。我感謝你的努力。 –

+0

哦,這應該工作。但在我嘗試之前,你應該得到非常感謝。 21小時放棄賞金。忍耐。 –

+0

很高興我可以幫助:) –