2

나는 만들고있는 응용 프로그램의 메뉴 목록을 만들고 있습니다. 나는이 튜토리얼을 따라 그것을 만들었다 (필요에 따라 값을 변경) - http://www.ezzylearning.com/tutorial.aspx?tid=1763429.사용자 지정 목록에서 단일 행 재정의 또는 추가

이제 내 목록이 너무 복잡하지 않습니다. 매번 동일한 데이터를 가지며 두 개의 섹션 만 있습니다. 지금까지, 내 ​​목록이 작동해야하지만 XML에서 다른보기/레이아웃 7 항목을 대체하거나에서 해당 뷰를 추가 할 필요가

현재 코드 ....

주요 활동 :.

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.ListView; 


public class HU_main extends Activity { 

    private ListView f_menu; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.hu_main); 

     Front_menu front_menu_data[] = new Front_menu[] { 
      new Front_menu("Cadences", "Reference chart of all the primary cadences."), 
      new Front_menu("Chords and Non-Chord Tones", "Reference chart of chord types and non-chord tones and associated rules of NCTs."), 
      new Front_menu("Key Signatures", "Reference chart for key signature rules."), 
      new Front_menu("Scale/Mode Triads", "List of triads and degrees for all standard diatonic scale modes."), 
      new Front_menu("Harmonic Progression", "Reference chart for scale and mode chord progressions."), 
      new Front_menu("Terminology Translation", "Reference list if primary music terms and instruments in German, Italian and French."), 
      new Front_menu("Replace", "Replace"), 
      new Front_menu("Chord Finder", "Enter notes to find chords."), 
      new Front_menu("Modulation", "Reference chart of chord types and non-chord tones and associated rules of NCTs."), 
      new Front_menu("Scale Finder", "Find scales and modes by notes."), 
      new Front_menu("Transposition", "Show changes to and from concert pitch for transposing instruments or determine overall transposition of key.") 
      }; 

      Front_menuAdapter adapter = new Front_menuAdapter(this, 
      R.layout.item_layout, front_menu_data); 

      f_menu = (ListView)findViewById(R.id.f_menu); 

      f_menu.setAdapter(adapter); 


     } 

    } 

Front_menuAdapter :

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 


public class Front_menuAdapter extends ArrayAdapter<Front_menu> { 
    Context context; 
    int layoutResourceId; 
    Front_menu data[] = null; 



    public Front_menuAdapter(Context context, int layoutResourceId, Front_menu[] data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    Front_menuHolder holder = null; 


     if (row == null) { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new Front_menuHolder(); 
      holder.txtTitle1 = (TextView)row.findViewById(R.id.menu_item); 
      holder.txtTitle2 = (TextView)row.findViewById(R.id.item_description); 
      holder.header2 = (TextView)row.findViewById(R.id.tools_header); 

      row.setTag(holder); 


      if (position != 6) { 
       holder.txtTitle1.setVisibility(View.VISIBLE); 
       holder.txtTitle2.setVisibility(View.VISIBLE); 
       holder.header2.setVisibility(View.GONE); 
      } 

      else if (position == 6) { 
       holder.header2.setVisibility(View.VISIBLE); 
       holder.txtTitle1.setVisibility(View.GONE); 
       holder.txtTitle2.setVisibility(View.GONE); 
      } 

     } 

     else { 
      holder = (Front_menuHolder)row.getTag(); 
     } 


     Front_menu front_menu = data[position]; 
     holder.txtTitle1.setText(front_menu.item); 
     holder.txtTitle2.setText(front_menu.desc); 

     return row; 
    } 

    class Front_menuHolder { 
     TextView txtTitle1; 
     TextView txtTitle2; 
     TextView header2; 
    } 

} 


Front_menu (constructor): 

    public class Front_menu { 
     public String item; 
     public String desc; 
     public Front_menu() { 
      super(); 
     } 

     public Front_menu(String item, String desc) { 
      super(); 
      this.item = item; 
      this.desc = desc; 
     } 

    } 

답변

1

대신 하나 개의 항목에 대한 View 새로운 팽창에 대한 걱정으로 다르게 표시하기 위해, 왜 안 J 현재을 현재 XML에 정의해야합니까?

예를 들어, 사용자의 Facebook 뉴스 피드를 보여주는 광산 앱에서 코드의 실제 코드를 가져옵니다 (필자는 코드를 짧게하고 원하지 않는 코드를 제거했습니다). 사용자는 자신의 뉴스 피드에 상태 업데이트/사진 또는 비디오를 가질 수 있습니다. 따라서 여러 레이아웃 XML을 만드는 대신 XML을 사용하여 XML을 모두 정의한 후 adapter에서 부풀게합니다.

XML 예 :

<!-- STATUS | PHOTO --> 

    <LinearLayout 
     android:id="@+id/linlaStatusPhoto" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="2dp" 
     android:gravity="center" 
     android:orientation="vertical" 
     android:visibility="gone" > 

     .... OTHER ELEMENTS NEEDED 

    </LinearLayout> 


    <!-- VIDEO LAYOUT --> 

    <LinearLayout 
     android:id="@+id/linlaVideo" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:visibility="gone" > 

     .... OTHER ELEMENTS NEEDED 

    </LinearLayout> 

이제 어댑터, 내가 피드의 유형에 대한 상태를 확인하고 다른 숨어있는 동안 필요한 레이아웃을 보여줍니다.

if (feedType.equals("status") || feedType.equals("photo")) { 

    // SHOW THE NECESSARY LAYOUT CONTAINER 
    holder.linlaStatusPhoto.setVisibility(View.VISIBLE); 

    // HIDE THE OTHERS 
    holder.linlaVideo.setVisibility(View.GONE); 

    // I HAVE MORE CONDITIONS TO CHECK. HENCE THE else if(). 
} else if (feedType.equals("video")) { 

    // SHOW THE NECESSARY LAYOUT CONTAINER 
    holder.linlaVideo.setVisibility(View.VISIBLE); 

    // HIDE THE OTHERS 
    holder.linlaStatusPhoto.setVisibility(View.GONE); 

} 

귀하의 계획에 맞게이 코드를 쉽게 적용 할 수 있습니다. 중 어떤 것을 표시해야하는지 확인하려면 약간의 점검을해야합니다. 그러나 다른 사람을 부 풀릴 경우에도 마찬가지입니다. View. 목록에서 항상 7 번째 항목 인 경우 front_menu_data[]에 항목 번호가있는 매개 변수를 하나 더 추가하여 위의 예를 트리거 할 수 있습니다.

UPDATE :

여기에서 if...else 코드 블록을 이동

:

if (row == null) { 
    LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
    row = inflater.inflate(layoutResourceId, parent, false); 

    holder = new Front_menuHolder(); 
    holder.txtTitle1 = (TextView)row.findViewById(R.id.menu_item); 
    holder.txtTitle2 = (TextView)row.findViewById(R.id.item_description); 
    holder.header2 = (TextView)row.findViewById(R.id.tools_header); 

    row.setTag(holder); 

    // MOVE THIS BLOCK 
    if (position != 6) { 
     holder.txtTitle1.setVisibility(View.VISIBLE); 
     holder.txtTitle2.setVisibility(View.VISIBLE); 
     holder.header2.setVisibility(View.GONE); 
    } else if (position == 6) { 
     holder.header2.setVisibility(View.VISIBLE); 
     holder.txtTitle1.setVisibility(View.GONE); 
     holder.txtTitle2.setVisibility(View.GONE); 
    } 

} else { 
    holder = (Front_menuHolder)row.getTag(); 
} 

사람 :

Front_menu front_menu = data[position]; 

if (position != 6) { 
    holder.txtTitle1.setVisibility(View.VISIBLE); 
    holder.txtTitle2.setVisibility(View.VISIBLE); 
    holder.header2.setVisibility(View.GONE); 

    holder.txtTitle1.setText(front_menu.item); 
    holder.txtTitle2.setText(front_menu.desc); 

} else if (position == 6) { 
    holder.header2.setVisibility(View.VISIBLE); 
    holder.txtTitle1.setVisibility(View.GONE); 
    holder.txtTitle2.setVisibility(View.GONE); 

    holder.txtTitle1.setText(front_menu.item); 
    holder.txtTitle2.setText(front_menu.desc); 
} 
+0

감사합니다, 나는이 시도됩니다. 위 어댑터에 자바를 추가해야합니까? –

+0

또한 "feedType"은 (는) 무엇을 가리 킵니까? –

+0

사실, 걱정하지 마세요. 어디에 넣을 지 알았습니다. 작동합니다. 고마워, 나는 그곳에서 단지 하나의 견해를 얻기 위해 말도 안되는 양의 코드를 부어 야한다고 생각했다. 나는 드로어 블을 제거하기 위해 비트를 약간 조정해야만하고, 원하는대로 정확하게 작동합니다. –