如何动态添加行,检测和删除点击?

时间:2013-07-06 21:43:56

标签: android eclipse rows android-tablelayout

我正在动态地向表中添加行。我有几个textViews [],我添加到行[]然后我添加行[]到表。没关系,但后来我想检测一下textView []并删除那一行,我也希望删除下面的textViews数量减少。

示例:

1 a a a //(I delete this row)
2 b b b
3 c c c

删除后,我希望这样:

1 b b b
2 c c c

我尝试将onClickListener添加到一个textView [],但有时会删除row []并减少数量,有时则不会。

有人可以给我一些例子试试吗?

编辑:这是我的代码(我认为这就是所需要的) 这是我的按钮上添加行的代码:

public TextView textViewKoeficijent[] = new TextView[50];
public TextView textViewBr[] = new TextView[50];
public TextView textViewObrisi[] = new TextView[50];
public TextView textViewTip[] = new TextView[50];
public TextView textViewPar[] = new TextView[50];


   fkoeficijent = Double.valueOf(koeficijent);
        koefIzracun = koefIzracun * fkoeficijent;

        TextView textViewKoeficijentIzracun = (TextView) findViewById(R.id.textViewUkupniKoeficijentIzracun);
        koefIzracun = Math.round(koefIzracun*100)/100.0d;
        koefIzracunString = String.valueOf(koefIzracun);
        textViewKoeficijentIzracun.setText(koefIzracunString);

        final TableLayout PopisParova = (TableLayout) findViewById(R.id.TableLayout);

        final TableRow noviPar[] = new TableRow[50];

        LayoutParams paramsBroj = new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1);
        paramsBroj.setMargins(4, 0, 2, 4);
        LayoutParams paramsPar = new LayoutParams(0, LayoutParams.WRAP_CONTENT, 2);
        paramsPar.setMargins(2, 0, 2, 4);
        LayoutParams paramsKoef = new LayoutParams(0, LayoutParams.WRAP_CONTENT, 2);
        paramsKoef.setMargins(2, 0, 4, 4);

        //onclicklistener:
        OnClickListener onClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // TODO Auto-generated method stub
                id = view.getId();

                brpara --;

                TextView textViewKoeficijentIzracun = (TextView) findViewById(R.id.textViewUkupniKoeficijentIzracun);
                if(brpara==1){
                    textViewKoeficijentIzracun.setText("0");
                    koefIzracun = 1;
                }

                else{
                koeficijent = textViewKoeficijent[id].getText().toString();
                fkoeficijent = Double.valueOf(koeficijent);
                koefIzracun = koefIzracun / fkoeficijent;

                koefIzracun = Math.round(koefIzracun*100)/100.0d;
                koefIzracunString = String.valueOf(koefIzracun);
                textViewKoeficijentIzracun.setText(koefIzracunString);}

                PopisParova.removeViewAt(id);
                //PopisParova.removeView(noviPar[id]);

                for(i=1; i<=brpara; i++){
                    if(i>id){
                        String bri = String.valueOf(i-1);
                        textViewBr[i].setText(bri);
                        textViewObrisi[i].setDrawingCacheBackgroundColor(i-1);
                    }
                }

            }};

         {
            textViewBr[brpara] = new TextView(MainActivity.this);
            textViewBr[brpara].setLayoutParams(paramsBroj);
            textViewBr[brpara].setGravity(Gravity.CENTER_HORIZONTAL);
            textViewBr[brpara].setBackgroundColor(0xFFFFFFFF);
            brojPara = String.valueOf(brpara);
            textViewBr[brpara].setText(brojPara); 
            textViewBr[brpara].setId(brpara);
            }

         {
            textViewPar[brpara] = new TextView(MainActivity.this);
            textViewPar[brpara].setLayoutParams(paramsPar);
            textViewPar[brpara].setGravity(Gravity.CENTER_HORIZONTAL);
            textViewPar[brpara].setBackgroundColor(0xFFFFFFFF);
            textViewPar[brpara].setText(par);    
            textViewPar[brpara].setId(brpara);
            }

         {
            textViewTip[brpara] = new TextView(MainActivity.this);
            textViewTip[brpara].setLayoutParams(paramsPar);
            textViewTip[brpara].setGravity(Gravity.CENTER_HORIZONTAL);
            textViewTip[brpara].setBackgroundColor(0xFFFFFFFF);
            textViewTip[brpara].setText(tip);    
            textViewTip[brpara].setId(brpara);
            }

         {
            textViewKoeficijent[brpara] = new TextView(MainActivity.this);
            textViewKoeficijent[brpara].setLayoutParams(paramsPar);
            textViewKoeficijent[brpara].setGravity(Gravity.CENTER_HORIZONTAL);
            textViewKoeficijent[brpara].setBackgroundColor(0xFFFFFFFF);
            textViewKoeficijent[brpara].setText(koeficijent);    
            textViewKoeficijent[brpara].setId(brpara);
            }

         {
            textViewObrisi[brpara] = new TextView(MainActivity.this);
            textViewObrisi[brpara].setLayoutParams(paramsKoef);
            textViewObrisi[brpara].setGravity(Gravity.CENTER_HORIZONTAL);
            textViewObrisi[brpara].setBackgroundColor(0xFFFFFFFF);
            textViewObrisi[brpara].setText("X");    
            textViewObrisi[brpara].setId(brpara);
            textViewObrisi[brpara].setClickable(true);
            textViewObrisi[brpara].setOnClickListener(onClickListener);
            }

        noviPar[brpara] = new TableRow(MainActivity.this);
        noviPar[brpara].addView(textViewBr[brpara]);
        noviPar[brpara].addView(textViewPar[brpara]);
        noviPar[brpara].addView(textViewTip[brpara]);
        noviPar[brpara].addView(textViewKoeficijent[brpara]);
        noviPar[brpara].addView(textViewObrisi[brpara]);
        PopisParova.addView(noviPar[brpara]);

        brpara++;

        editTextPar.setText("");
        editTextTip.setText("");
        editTextKoeficijent.setText("");

编辑[2]: brpara是我的柜台,所以我知道哪个是正在添加的行数。我最多有20行。 此外,我的循环完美地用于删除一行,但是当我一次删除多行时,它只是第一次更改我的行号,之后只删除行。

2 个答案:

答案 0 :(得分:0)

你在做什么呢:

让我们说brpara = 3。

单击id = 2的视图。

你执行brbara - ;所以brbara现在是2。

你检查是否id!= brpara他们不是没有重新编号。逻辑问题!

此外你有这个循环:

for(i=id+1; i<=brpara; i++){
                    i=id+1;
                    String bri = String.valueOf(id);
                    textViewBr[i].setText(bri);
                    textViewObrisi[i].setId(id);}

你说我必须是id + 1(在我们的例子3中)到&lt; brpara(在我们的示例2中)所以3&lt; = 2它永远不会执行,如果id和brpara允许循环执行你重置循环中的i

i=id+1;

例如,如果以i = id + 1开头的循环让我们说id = 2,那么它现在是3并进入循环内部,i将始终为3,因为你正在循环中重置它。

从您的代码中不清楚您是如何使用brpara但是重新编号的循环是错误的。所以让我们假设brpara总是数组中的最后一个索引然后我建议使用以下代码:

@Override
        public void onClick(View view) {
            // TODO Auto-generated method stub
            id = view.getId();

            TextView textViewKoeficijentIzracun = (TextView) findViewById(R.id.textViewUkupniKoeficijentIzracun);
            if(brpara==1){
                textViewKoeficijentIzracun.setText("0");
                koefIzracun = 1;
            }

            else{
            koeficijent = textViewKoeficijent[id].getText().toString();
            fkoeficijent = Double.valueOf(koeficijent);
            koefIzracun = koefIzracun / fkoeficijent;

            koefIzracun = Math.round(koefIzracun*100)/100.0d;
            koefIzracunString = String.valueOf(koefIzracun);
            textViewKoeficijentIzracun.setText(koefIzracunString);}

            //FIRST RENUMBER ALL VIEWS FROM id+1 to brpara               
            if(id!=brpara){
                for(i=id+1; i<=brpara; i++){
                    String bri = String.valueOf(i - 1); //<--HERE MAYBE MUST BE i-1 NOT id...
                    textViewBr[i].setText(bri);
                    textViewObrisi[i].setId(id);} //THIS DOESN'T FEEL RIGHT MAYBE i INSTEAD OF id? OR i - 1?
            }

            //AND FINALY REMOVE VIEW AND DECREASE brpara...
            PopisParova.removeViewAt(id);
            brpara --; 
        }

我的建议假设brpara始终是最后一个索引,并且您正在从单击的视图+ 1重新编号到结尾。然而,有一个更优雅的解决方案是创建一个函数,无论点击视图如何,都会从上到下重新编号整个数组,并在添加或删除视图时调用它。这样你根本不需要管理brpara,但这取​​决于你想要达到的目的。

根据您的修改

试试这个:

@Override
        public void onClick(View view) {
            // TODO Auto-generated method stub
            id = view.getId();

            TextView textViewKoeficijentIzracun = (TextView) findViewById(R.id.textViewUkupniKoeficijentIzracun);
            if((brpara - 1)==1){
                textViewKoeficijentIzracun.setText("0");
                koefIzracun = 1;
            } else {
                koeficijent = textViewKoeficijent[id].getText().toString();
                fkoeficijent = Double.valueOf(koeficijent);
                koefIzracun = koefIzracun / fkoeficijent;

                koefIzracun = Math.round(koefIzracun*100)/100.0d;
                koefIzracunString = String.valueOf(koefIzracun);
                textViewKoeficijentIzracun.setText(koefIzracunString);

                PopisParova.removeViewAt(id);
                brpara --;

                for(i=1; i<=brpara; i++){
                    String bri = String.valueOf(i);
                    textViewBr[i].setText(bri);
                    textViewObrisi[i].setDrawingCacheBackgroundColor(i);
                }

            }
        }

由于brpara是一个计数器,所以只有在实际删除视图时才应减少它。您可能需要更改

if((brpara - 1)==1){

if(brpara==1){

根据您的需求。但现在循环似乎没问题。

希望这会有所帮助......

答案 1 :(得分:0)

唯一可行的解​​决方案是使用以下行替换已删除的行及其数据,并将其数据和删除最后一行替换。所以看起来删除的行真的被删除了。

row[x] = row[x+1] // want to delete this
row[x+1] = row[x+2]
//... and like that until the last row
row[last] // delete this row