android - 在自定义 ListView 中覆盖或添加单行

标签 android android-listview android-adapter android-adapterview

我正在为我正在制作的应用程序制作菜单列表。我按照本教程创建它(根据需要更改值)- http://www.ezzylearning.com/tutorial.aspx?tid=1763429 .

现在我的列表不是很复杂。每次都会有相同的数据,而且只有两个部分。到目前为止,我的列表可以正常工作,但我需要用 xml 中的不同 View /布局替换第 7 项或添加该 View 。

当前代码....

主要 Activity :

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

    }

最佳答案

为什么不在当前 XML 中定义另一个 layout,而不是担心为一个项目膨胀新的 View 以不同方式显示?

例如,我的一个应用程序中的一段实际代码显示了用户的 Facebook 新闻源(我已经缩短了它并从中删除了不需要的代码)。用户可以在他/她的新闻源上有状态更新/照片或视频。因此,我没有创建多个布局 XML,而是在我在 adapter 中膨胀的一个 XML 中定义它们。

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[] 添加一个参数,该参数将保存项目编号并使用它来触发上述示例。

更新:

从这里移动 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);
}

关于android - 在自定义 ListView 中覆盖或添加单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16138857/

相关文章:

java - Android - NullPointerException SimpleAdapter - 固定部分 ListView?

android - ListView 过滤器计数

尽管 app_id 正确,Android facebook applicationId cannot be null 错误

java - 如何从Android中的服务器播放音频

java - 如何在 Android 中使用 Jackson 从 JSONArray url 获取 java 对象

java - Adapter.getItem(position) 使应用程序崩溃

android - APAD 上的串行端口 - 在哪里讨论这个?

android - Android NDK 的 OpenMAX 可以用于将实时视频/音频流式传输到服务器吗?例子?

java - 使用 connectedInstrumentTest 构建 Android 作业不适用于 Jenkins

android - `ListView.invalidateViews()` 和 'Adapter.notifyDataSetChanged()' 之间有什么区别吗?