【问题标题】:Adding a new row dynamically using a button使用按钮动态添加新行
【发布时间】:2013-03-25 12:12:23
【问题描述】:

我试图在单击按钮时在列表视图中添加行,但我的应用程序每次都崩溃。 这是我的代码:

public class MTCRichGraphicsActivity extends Activity {
int ELEMENT_COUNT = 3;
int position=0;
Button bAddView;
String[] elements = new String[ELEMENT_COUNT];

int r =0 ;   


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    bAddView = (Button) findViewById(R.id.bNewEvent);
   final ListView list = (ListView) findViewById(R.id.list3d);
    bAddView.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            switch(v.getId())
            {
            case R.id.bNewEvent :
                for (int i = 0; i< ELEMENT_COUNT; i++) {
                    elements[i] = String.valueOf(i);
                }
                final MyAdapter adapter = new MyAdapter(MTCRichGraphicsActivity.this,elements);
                adapter.notifyDataSetChanged();
                //list.setScrollY(currentPosition);
                //list.setTranslationY(currentPosition);
                list.setDivider( null ); 
                list.setAdapter(adapter);

                adapter.notifyDataSetChanged();

                ELEMENT_COUNT = ELEMENT_COUNT + 3;
            }

        }
    });

}

}

这里我想在每次单击按钮(即 bNewEvent)时添加 3 行,所以我每次都将 ELEMENT_COUNT 增加 3。第一次可以正常使用,但是第二次按下按钮就崩溃了。

这是我的适配器类:

public class MyAdapter extends BaseAdapter {

private final LayoutInflater mInflater;
private final String[] mItems;
TextView t;
ViewHolder holder;
public MyAdapter(Activity c,String[] objects) {
    mInflater = c.getLayoutInflater();
    mItems = objects;
}

public int getCount() {
    return mItems.length;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
    TextView t;
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.listitem2, parent,false);
}
    holder = new ViewHolder();
    holder.t1 = (TextView) convertView.findViewById(R.id.tv1); 
    holder.t2 = (TextView) convertView.findViewById(R.id.tv2);
    holder.t3 = (TextView) convertView.findViewById(R.id.tv3);
    holder.t4 = (TextView) convertView.findViewById(R.id.tv4);
    holder.t1.setText("Title"+position);
    position = position + 3;

    //((ImageView)convertView).setTextAlignment(1);

    return convertView;
}

@Override
public Object getItem(int position) {
    return mItems[position];
}

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

}

【问题讨论】:

  • 你能给我们看看你的 logcat 吗?
  • 使用集合类而不是像 List 这样的数组,你不能在运行时增加数组的大小,使其不可变
  • @Premsuraj 是对的。你必须使用arraylist而不是array,因为arraylist不需要初始化它上面的元素数量。
  • 在 logcat 中显示越界异常

标签: android list listview baseadapter android-adapter


【解决方案1】:

你不能使用这样的数组..

String[] elements = new String[ELEMENT_COUNT];

导致数组具有与 ELEMENT_COUNT 的初始值相同数量的元素,您不能只将 ELEMENT_COUNT 增加 3 并尝试

        for (int i = 0; i< ELEMENT_COUNT; i++) {
            elements[i] = String.valueOf(i);
        }

因为数组只包含最初定义的元素。您需要将“元素”更改为 ArrayList。

ArrayList<string> elements;

【讨论】:

    【解决方案2】:

    你定义

    int ELEMENT_COUNT = 3;
    String[] elements = new String[ELEMENT_COUNT];
    

    但你不能调整数组大小

     for (int i = 0; i< ELEMENT_COUNT; i++) {
                    elements[i] = String.valueOf(i);
                }
    

    所以你得到了异常

    将数组更改为列表

    喜欢

    List<String> element =new ArrayList<String>();
    
    
    
       for (int i = 0; i< ELEMENT_COUNT; i++) {
                    element.add("String.valueOf(i)")
                }
    

    而且更换适配器也是这样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-03
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      相关资源
      最近更新 更多