2017-11-02 15 views
0

여기 내 재치가 있습니다. 나는 대화 상자를 사용하여 사용자가 양식을 채우도록하려는이 안드로이드 뷰를 작업 해왔다. 양식에는 두 개의 스피너를 사용하여 표시하려는 두 개의 목록 항목이 있습니다. 두 번째 목록의 내용은 목록 1의 선택된 항목을 기반으로 채워집니다. 두 개의 스피너 모두 항목을 선택하고 나면 재활용 자보기를 사용하여 채울 추가 필드를 표시합니다. 이 필드는 목록 2에서 선택한 항목을 기반으로 결정됩니다.사용자 지정 개체가있는 Spinner가 사용자 지정 대화 상자 내부에 있음 목록 조각이 작동하지 않습니다.

현재 가장 큰 문제점은 대화 상자에서 항목의 첫 번째 목록을 표시 할 수 없다는 것입니다. 메시지가 나타나면 대화 상자와 내부의 회 전자가 잘 렌더링됩니다. 그러나 회 전자는 항상 비어 있습니다.

여기 내 코드가 있습니다. 내 사용자 지정 대화 상자에 대한

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:padding="10dp" 
     android:textSize="14sp" 
     android:textColor="@android:color/black"/> 
</LinearLayout> 

레이아웃을 : 나는 spinner.xml 레이아웃 마크 업으로 시작합니다

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/properties_ll" 
    android:background="@color/translucent_green"> 
    <Spinner 
     android:layout_width="120dp" 
     android:layout_height="40dp" 
     android:clickable="true" 
     android:id="@+id/material_types_dd" 
     android:spinnerMode="dropdown"/> 
    <Spinner 
     android:layout_width="120dp" 
     android:layout_height="40dp" 
     android:clickable="true" 
     android:id="@+id/materials_dd" 
     android:spinnerMode="dropdown"/> 
    <android.support.v7.widget.RecyclerView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/material_detials_rv"/> 
</LinearLayout> 

사용자 정의 대화 클래스 (발리를 사용하여 모든 HTTP 호출이 노력하고 있습니다 철저하게 테스트되었습니다, 그래서 문제가)가 아니라는 것을 알고 :

public class TacDetailsDialogFragment extends DialogFragment { 

    private static final String TAG = TacDetailsDialogFragment.class.getSimpleName(); 


    @BindView(R.id.properties_ll) 
    LinearLayout properties; 

    @BindView(R.id.material_types_dd) 
    Spinner materialtypesDD; 

    @BindView(R.id.materials_dd) 
    Spinner materialsdd; 

    @BindView(R.id.material_detials_rv) 
    RecyclerView materialDetailsRecycler; 

    private List<BaseModel> materials; 
    private List<BaseModel> materialTypes; 
    private BaseModel selectedMaterial; 
    private BaseModel selectedMaterialType; 
    private List<BaseModel> selectedMaterialFields; 
    private List<List<BaseModel>> selectedMaterialFieldUnits; 

    ProgressBarHelper progressBarHelper; 

    @NonNull 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     LayoutInflater inflater = getActivity().getLayoutInflater(); 

     builder.setView(inflater.inflate(R.layout.tac_details_dialog, null)) 
       .setPositiveButton(
        R.string.ok, 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 

         } 
        } 
       ) 
       .setNegativeButton(
        "Cancel", 
        new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int which) { 
          TacDetailsDialogFragment.this.getDialog().cancel(); 
         } 
        } 
       ); 
     View view = inflater.inflate(R.layout.tac_details_dialog, null); 
     ButterKnife.bind(this, view); 

     progressBarHelper = new ProgressBarHelper(this.getActivity()); 
     getMaterialTypes(); 
     materialtypesDD.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       Log.d(TAG, materialTypes.get(position).toString()); 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 

      } 
     }); 

//  materialsdd.setOnItemSelectedListener(new ClickToSelectEditText.OnItemSelectedListener() { 
//   @Override 
//   public void onItemSelectedListener(Object item, int selectedIndex) { 
//    getMaterialFields(); 
//   } 
//  }); 


     return builder.create(); 
    } 

    /* The activity that creates an instance of this dialog must implement 
    * this interface in order to receive event callbacks. Each method 
    * passes the dialogfrag in case the host needs to query it */ 
    public interface TacDetailsDialogListener { 
     public void onDialogPositiveClick(DialogFragment dialog); 
    } 

    TacDetailsDialogListener mListener; 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     try{ 
      mListener = (TacDetailsDialogListener) context; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(context.toString() + " must implement TacDetailsDialogListener"); 
     } 
    } 

    private void initMaterialTypesDD() { 
     materialtypesDD.setAdapter(new ArrayAdapter<BaseModel>(getContext(), R.layout.spinner, materialTypes) { 
      @Override 
      public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
       View view = super.getDropDownView(position, convertView, parent); 

//    TextView text = (TextView) view.findViewById(R.id.text1); 
//    text.setVisibility(View.VISIBLE); 
//    text.setTextColor(Color.BLACK); 

       return view; 
      } 
     }); 
    } 


    private void initMaterialsDD() { 
     materialsdd.setAdapter(new ArrayAdapter<>(getContext(), R.layout.support_simple_spinner_dropdown_item, materials)); 
    } 

    private void initMaterialFields() { 
     materialDetailsRecycler.setLayoutManager(new LinearLayoutManager(this.getContext(), LinearLayoutManager.VERTICAL, false)); 
     materialDetailsRecycler.setAdapter(new MaterialDetailRecyclerViewAdapter(selectedMaterialFields, selectedMaterialFieldUnits)); 
    } 

    private void initMaterialTypes(JSONArray data) throws JSONException { 
     materialTypes = new ArrayList<BaseModel>(); 
     for (int i = 0; i < data.length(); i++) { 
      materialTypes.add(new BaseModel(data.getJSONObject(i))); 
     } 
    } 

    public void initMaterials(JSONArray data) throws JSONException { 
     materials = new ArrayList<BaseModel>(); 
     for (int i = 0; i < data.length(); i++) { 
      materials.add(new BaseModel(data.getJSONObject(i))); 
     } 
    } 


    public void initSelectedMaterialFields(JSONArray data) throws JSONException { 
     selectedMaterialFields = new ArrayList<BaseModel>(); 
     selectedMaterialFieldUnits = new ArrayList<List<BaseModel>>(); 
     for (int i = 0; i < data.length(); i++) { 
      JSONObject field = data.getJSONObject(i); 
      selectedMaterialFields.add(new BaseModel(field)); 

      JSONArray fieldUnits = field.getJSONArray("units"); 
      List<BaseModel> units = new ArrayList<>(); 
      for (int j = 0; j < fieldUnits.length(); j++) { 
       units.add(new BaseModel(fieldUnits.getJSONObject(j))); 
      } 
      selectedMaterialFieldUnits.add(units); 
     } 
    } 

    private void getMaterialTypes() { 
     VolleySingleton.getInstance(this.getContext()).addToRequestQueue(
       new JsonObjectRequest(
         Request.Method.GET, 
         getString(R.string.server_ip) + getString(R.string.materialtypes), 
         null, 
         new Response.Listener<JSONObject>() { 
          @Override 
          public void onResponse(JSONObject response) { 
           try { 
            if (response.getInt("code") == 200) { 
             initMaterialTypes(response.getJSONArray("data")); 
             initMaterialTypesDD(); 
            } 
           } catch (JSONException e) { 
            e.printStackTrace(); 
           } 

          } 
         }, 
         new Response.ErrorListener() { 
          @Override 
          public void onErrorResponse(VolleyError error) { 
           error.printStackTrace(); 
          } 
         } 
       ) 
     ); 
    } 

    private void getMaterials() { 
     VolleySingleton.getInstance(this.getContext()).addToRequestQueue(
       new JsonObjectRequest(
         Request.Method.GET, 
         getActivity().getString(R.string.server_ip) + getActivity().getString(R.string.materials) + selectedMaterialType.getId(), 
         null, 
         new Response.Listener<JSONObject>() { 
          @Override 
          public void onResponse(JSONObject response) { 
           try { 
            if (response.getInt("code") == 200) { 
             JSONArray data = response.getJSONArray("data"); 
             initMaterials(data); 
             initMaterialsDD(); 
            } 
           } catch (JSONException e) { 
            e.printStackTrace(); 
           } 
          } 
         }, 
         new Response.ErrorListener() { 
          @Override 
          public void onErrorResponse(VolleyError error) { 

          } 
         } 
       ) 
     ); 
    } 
    private void getMaterialFields() { 
     VolleySingleton.getInstance(this.getContext()).addToRequestQueue(
       new JsonObjectRequest(
         Request.Method.GET, 
         getString(R.string.server_ip) + getString(R.string.materialfields) + selectedMaterial.getId(), 
         null, 
         new Response.Listener<JSONObject>() { 
          @Override 
          public void onResponse(JSONObject response) { 
           try { 
            if (response.getInt("code") == 200) { 
             initSelectedMaterialFields(response.getJSONArray("data")); 
             initMaterialFields(); 
            } 
           } catch (JSONException e) { 
            e.printStackTrace(); 
           } 
          } 
         }, 
         new Response.ErrorListener() { 
          @Override 
          public void onErrorResponse(VolleyError error) { 

          } 
         } 
       ) 
     ); 
    } 
} 

사용자 정의 개체, BASEMODEL :

RecyclerView 비트 그래서이 이미 코드 복잡 질문을 포함한 관련이없는 경우

public void makeTacDetailsAlert() { 
     dialog = new TacDetailsDialogFragment(); 
     dialog.show(this.getSupportFragmentManager(), "TacDetailsDialogFragment"); 
    } 

IDK :

는 그리고 이것은 내가 주요 활동에서 대화 상자를 호출하는 방법입니다.

당신에게, S/O 신.

+0

흰색으로 스피너 레이아웃 textview 색상이 설정되어있어 문제가 없는지 확인하십시오. 검정색으로 변경 한 다음 시도하십시오. – Munir

+0

@ 문경 그 점을 지적 해 주셔서 감사합니다. 그것을 검은 색으로 바꿨지 만 실제로 차이를 만들지는 않았다. 문제는 어댑터가 설정되지 않는다고 생각합니다. 그러나 디버깅 할 때 코드의 일부가 원활하게 실행됩니다. – wanderingProgrammer

답변

0

좋은 밤의 잠에 감사 드리며, @ Sam의 답변 (https://stackoverflow.com/a/14676975/3438497)에 문제가 해결되었습니다. 보장 이외의

여기 제안 나는, 나는 또한 BASEMODEL 개체에 대한 사용자 정의 SpinnerAdapter을 만드는 데 필요한 내 동일한 레이아웃 인스턴스에 대한 대화와 개별 뷰 (그리고 다른 인스턴스)를 결합 것을 : https://stackoverflow.com/a/8116756/3438497

희망을 이 문제에 직면 한 다른 누구에게도 도움이됩니다.