2

私が作っているアプリのメニューリストに取り組んでいます。このチュートリアルに従って作成しました(必要に応じて値を変更します) - http://www.ezzylearning.com/tutorial.aspx?tid=1763429

今、私のリストはそれほど複雑ではありません。毎回同じデータがあり、2 つのセクションしかありません。これまでのところ、リストは機能していますが、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;
        }

    }
4

1 に答える 1

1

1 つの項目を別の方法で表示するためにnew をインフレートすることを心配する代わりに、現在の XML でView別の項目を定義してみませんか?layout

たとえば、ユーザーの Facebook ニュースフィードを表示する私のアプリの実際のコードを見てみましょう (コードを短くして不要なコードを削除しました)。ユーザーは、自分のニュースフィードにステータス更新/写真またはビデオを持つことができます。したがって、複数のレイアウト 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 番目の項目である場合は、項目番号を保持するパラメーターをもう 1 つ追加し、front_menu_data[]それを使用して上記の例をトリガーすることができます。

アップデート:

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);
}
于 2013-04-22T04:15:44.377 に答える