0

我正在向表中动态添加行。我有几个 textViews[] 添加到 row[] 然后我将 row[] 添加到表中。没关系,但是我想检测点击 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 行。此外,我的循环非常适合删除一行,但是当我一次删除多行时,它只会第一次更改我的行号,之后只会删除行。

4

2 回答 2

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 中)到 < brpara (在我们的例子 2 中)所以 3 <= 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){

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

希望这可以帮助...

于 2013-07-11T16:44:16.253 回答
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
于 2013-08-07T10:03:31.770 回答