【问题标题】:Override or Add Single Row in Custom ListView在自定义 ListView 中覆盖或添加单行
【发布时间】:2013-04-24 11:49:55
【问题描述】:

我正在为我正在制作的应用程序制作菜单列表。我按照本教程创建它(根据需要更改值)-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;
        }

    }

【问题讨论】:

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


    【解决方案1】:

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

    以我的应用程序中的一段实际代码为例,它显示了用户的 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);
    }
    

    【讨论】:

    • 谢谢,我会试试这个。在上面的适配器中,我究竟应该在哪里添加 Java?
    • 其实别着急,我想好放哪里了,而且还有效。非常感谢,我担心我将不得不投入大量荒谬的代码才能获得其中的一个视图。我只需要稍微调整一下即可删除可绘制对象,它的工作方式与我想要的完全一样。
    • @anathematized_one:我很高兴你明白了。 :-)
    • 我可能没有完全正确。它确实有效,我修复了我的布局,但是当我向下滚动列表并向上滚动时,很多次它会将新视图移动到不正确的位置。我现在在“if (row == null) {”下和“row.setTag(holder);”之后我将其设置为“if (position != 6) {”和要显示的视图和“else if (position == 6) {”以及要显示的视图...
    • @anathematized_one:你能用新代码更新 OP 吗?让我们看看可以做些什么。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2019-01-31
    • 2014-02-17
    • 1970-01-01
    • 2014-02-11
    • 2017-08-19
    相关资源
    最近更新 更多