繁体   English   中英

如何在 Listview 适配器线性布局中添加项目

[英]How to add an item in Listview adapter Linear Layout

我知道如何填充列表视图,我知道如何制作自定义适配器。 我想在 ListView 的 rowLayout 的线性布局中添加 View。 这是 MyList 适配器。

我想要一个列表视图,其中每个项目布局都是在运行时创建的,但我无法实现。

这段代码在没有 ListView 的情况下工作,但是当我将它添加到 ListView 中的 Linearlayout 时。它给了我错误。

public class KmapListAdapter extends BaseAdapter  {

    Context context;
    LayoutInflater layoutInflater;
    List<KmapModel> mOriginalValues = new ArrayList<KmapModel>();


    public KmapListAdapter(Context activity, List<KmapModel> kmapModelList) {

        this.context = activity;
        this.mOriginalValues = kmapModelList;

    }

    @Override
    public int getCount() {
if(mOriginalValues == null)
    return  0;
        return mOriginalValues.size();
    }

    @Override
    public Object getItem(int position) {

        return mOriginalValues.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    ViewHolder Holder ;

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        KmapModel kmapModel;
        if (layoutInflater == null)
            layoutInflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            Holder = new ViewHolder();
            convertView = layoutInflater.inflate(R.layout.rowlayout, null);
            Holder.linearLayout = (LinearLayout) convertView.findViewById(R.id.linear_layout_matrix_1);

            convertView.setTag(Holder);

        } else
            Holder = (ViewHolder) convertView.getTag();


        kmapModel = mOriginalValues.get(position);
        Holder.linearLayout.addView(kmapModel.getLinearLayout());
        return convertView;
    }




    static class ViewHolder {
        LinearLayout linearLayout;}}

这是我的模特名单

 public List<KmapModel> ListViewOneItem( int ROWS, int COLS) {

        String[][] KmapArray = KMapMaker(ROWS, COLS);
        //  Log.v("Kmap array",""+KmapArray);
        TextView[][] KmapTextView = new TextView[KmapArray.length][KmapArray[0].length];

        int temp = 3;
        for (int i = 0; i < KmapArray.length; i++) {
            KmapModel kmapModel = new KmapModel();
            LinearLayout rowLinearLayout = makeRowLinearLayout();


            for (int j = 0; j < KmapArray[0].length; j++) {

                TextView rowTextView = makeTextView();
                rowTextView.setPadding(4, 4, 4, 4);


                rowLinearLayout.addView(rowTextView);
                KmapTextView[i][j] = rowTextView;// Add a text view in a jagged array for later use

            }
            kmapModel.setLinearLayout(rowLinearLayout);
            kmapModelList.add(kmapModel);


        }
        return  kmapModelList;
    }

现在我有一个错误

指定的孩子已经有一个父母。 您必须首先在孩子的父级上调用 removeView()。 在这条线上

 Holder.linearLayout.addView(kmapModel.getLinearLayout());

Q1) 如何解决这个问题 Q2) 为什么我会遇到这个问题?

谢谢@pskink,他给了我一种尝试的方法然后我上传解决方案。

指定的孩子已经有一个父母。

不要再试图给孩子第二个父母了。 所有视图均来自破碎的房屋。 他们有一位家长。

您可以向视图添加视图,不能添加已添加的视图。 这会导致循环和循环是循环的。 为了成功迭代视图树,它需要是一棵树。 所以视图只有一个父节点。 要么清除您已有的布局并使用它,要么向布局添加新视图,或者基本上不需要在视图树中的多个位置使用相同对象的任何您想要的任何内容。

现在,我终于在 Resaeaching 后找到了一个很好的解决方案。

感谢所有贡献的人。 这是我的列表适配器,我得到了我想要的

public class KmapListAdapter extends BaseAdapter {

    Activity context;
    LayoutInflater layoutInflater;
    List<KmapModel> mOriginalValues;


    public KmapListAdapter(Activity activity, List<KmapModel> kmapModelList) {

        this.context = activity;
        this.mOriginalValues = kmapModelList;

    }

    @Override
    public int getCount() {

        Log.d("SIZEOF",""+mOriginalValues.size());
        return mOriginalValues.size();
    }

    @Override
    public Object getItem(int position) {

        return mOriginalValues.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    ViewHolder Holder;

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {


        if (layoutInflater == null)
            layoutInflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            Holder = new ViewHolder();
            convertView = layoutInflater.inflate(R.layout.rowlayout, null);
            Holder.linearLayout = (LinearLayout) convertView.findViewById(R.id.linear_layout_matrix);

            convertView.setTag(Holder);



        LinearLayout rowLinearLayout = makeRowLinearLayout();
        Holder.linearLayout.addView(rowLinearLayout);
        KmapModel kmapModel = new KmapModel();
         kmapModel  = mOriginalValues.get(position);
         String[] array = kmapModel.getKmapString();
        for (int i=0 ; i< array.length;i++)
        {
            TextView rowTextView = makeTextView();
            rowTextView.setPadding(4, 4, 4, 4);
            rowTextView.setText(""+array[i]);
           rowLinearLayout.addView(rowTextView);

        }




        return convertView;
    }

    public TextView makeTextView() {
        LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, 80);
        lparams.setMargins(7, 0, 7, 0);

        TextView tv = new TextView(context);
        tv.setGravity(Gravity.CENTER);
        tv.setLayoutParams(lparams);
        tv.setTextSize((float) 17);
        tv.setMaxLines(10);

        tv.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.edittext_selector_background));
        return tv;
    }


    public LinearLayout makeRowLinearLayout() {
        LinearLayout linearLayout = new LinearLayout(context);
        linearLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT));
        linearLayout.setOrientation(LinearLayout.HORIZONTAL);


        return linearLayout;
    } // End of makeRowLinearLayout()

    static class ViewHolder {
        LinearLayout linearLayout;


    }


}

编辑

我们无法向已添加到某处的视图添加视图。 删除旧视图,并添加一个新视图,或者通过从中删除所有内容来重用旧视图。 但是,不会再将已添加的视图添加到视图树中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM