2

Я работаю над списком меню для приложения, которое я создаю. Я выполнил этот учебник для его создания (изменяя значения по мере необходимости) - http://www.ezzylearning.com/tutorial.aspx?tid=1763429.Переопределить или добавить одну строку в пользовательском ListView

Теперь мой список не очень сложный. Он будет иметь одинаковые данные каждый раз, и есть только два раздела. До сих пор у меня есть список работает, но мне нужно, чтобы заменить 7-й элемент с другим видом/макетом в XML или добавить эту точку зрения в

Текущего код ....

Основной деятельность:.

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 ust определить другой layout в текущем XML?

Возьмите, к примеру, фактический фрагмент кода из моего приложения, в котором отображается новостная лента пользователя Facebook (я сократил его и снял с него нежелательный код). Пользователь может иметь обновление статуса/фото или видео в своей ленте новостей. Поэтому вместо создания нескольких 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); 

} 

Вы можете легко адаптировать этот код к своей схеме вещей. Вам нужно будет использовать некоторую проверку, чтобы определить, какой из Widget должен быть показан. Но это правда, даже если вы должны надуть еще один 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(); 
} 

To:

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

Спасибо, я постараюсь это. Где именно, в моем адаптере выше, я добавляю Java? –

+0

Кроме того, что означает «feedType»? –

+0

На самом деле не волнуйтесь, я понял, куда его поместить, и это работает. Большое спасибо, я боялся, что мне придется вылиться в смешное количество кода, чтобы получить только один вид. Мне нужно лишь немного подстроить его, чтобы удалить из него чертеж, и он работает точно так, как я хотел. –