当前位置: 首页 > 知识库问答 >
问题:

为什么ListActivity不显示ArrayAdapter中的最后一项?

淳于鹏
2023-03-14

我使用以下代码进行我的主要活动:

private TripsData datasource;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        datasource = new TripsData(this);
        datasource.open();

        List values = datasource.getAllTrips();

        ArrayAdapter adapter = new ArrayAdapter(this,
                android.R.layout.simple_list_item_1, values);
        setListAdapter(adapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    // Will be called via the onClick attribute
      // of the buttons in main.xml
      public void onClick(View view) {
        @SuppressWarnings("unchecked")
        ArrayAdapter adapter = (ArrayAdapter) getListAdapter();
        Trip trip = null;
        //Trip trip_temp;
        switch (view.getId()) {
        case R.id.add:
            trip=newTrip(view);
            //trip.setId(trip_temp.getId());
            //trip.setName(trip_temp.getName());
            adapter.add(trip);
          break;

        case R.id.delete:
            if (getListAdapter().getCount() > 0) {
                trip = (Trip) getListAdapter().getItem(0);
                datasource.deleteTrip(trip);
                adapter.remove(trip);
            }
          break;
        }
        adapter.notifyDataSetChanged();
      }

      @Override
      protected void onResume() {
        datasource.open();
        super.onResume();
      }

      @Override
      protected void onPause() {
        datasource.close();
        super.onPause();
      }

      public Trip newTrip(View view){
            final Trip trip=new Trip();
            //create DialogBox
            final Dialog dialog = new Dialog(this);
            //modify features BEFORE setting content view
            //dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog.setContentView(R.layout.project_dialog);
            //Create EditBoxes for Dialog
            final EditText nameEdit=(EditText) dialog.findViewById(R.id.dialog_name_text);
            final EditText descEdit=(EditText) dialog.findViewById(R.id.dialog_type_text);
            //define button's text
            View dialogButton=dialog.findViewById(R.id.dialog_button_create);
            TextView text=(TextView) dialogButton;
            text.setText("Create");
            //Button Creation
            Button createButton = (Button) dialogButton;
            // if button is clicked, close the custom dialog
            createButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Trip trip_temp = datasource.createTrip(nameEdit.getText().toString());
                    //String[] trips = new String[] { "Cool", "Very nice", "Hate it" };
                    //int nextInt = new Random().nextInt(3);
                    // save the new comment to the database
                    trip.setId(trip_temp.getId());
                    trip.setName(trip_temp.getName());
                    //trip = datasource.createTrip(nameEdit.getText().toString());
                    dialog.dismiss();
                }
            });
            dialog.show();
            return trip;
        }

用户应该能够在对话框中输入值,并且名称将显示在创建的行程列表中。但是,当列表中只有一个值时,似乎存在一个bug,因为该项未显示。我花了好几个小时都弄不明白。

公共类TripsData{

private SQLiteDatabase database;
private TripsDB dbHelper;
private String[] allTrips = { TripsDB.TRIP_COLUMN_ID,
        TripsDB.TRIP_COLUMN_TYPE};

public TripsData(Context context){
    dbHelper = new TripsDB(context);
}

public void open() throws SQLException{
    database = dbHelper.getWritableDatabase();
}

public void close(){
    dbHelper.close();
}

public Trip createTrip(String type){
    ContentValues values = new ContentValues();
    values.put(TripsDB.TRIP_COLUMN_TYPE, type);
    long insertId = database.insert(TripsDB.TABLE_TRIPS, null, values);
    Cursor cursor = database.query(TripsDB.TABLE_TRIPS, 
            allTrips, TripsDB.TRIP_COLUMN_ID + " = " + insertId, null, null, null, null);
    cursor.moveToFirst();
    Trip newTrip = cursorToTrip(cursor);
    cursor.close();
    return newTrip;
}

public void deleteTrip(Trip trip){
    long id = trip.getId();
    System.out.println("Project deleted with id: " + id);
    database.delete(TripsDB.TABLE_TRIPS, TripsDB.TRIP_COLUMN_ID
            + " = " + id, null);
}

public List<Trip> getAllTrips(){
    List<Trip> trips = new ArrayList<Trip>();

    Cursor cursor = database.query(TripsDB.TABLE_TRIPS,
            allTrips, null, null, null, null, null);

    cursor.moveToFirst();
    while(!cursor.isAfterLast()){
        Trip trip = cursorToTrip(cursor);
        trips.add(trip);
        cursor.moveToNext();
    }
    cursor.close();
    return trips;
}

private Trip cursorToTrip(Cursor cursor){
    Trip trip = new Trip();
    trip.setId(cursor.getLong(0));
    trip.setName(cursor.getString(1));
    return trip;
}

共有1个答案

越伟泽
2023-03-14

问题似乎是TripsData类的问题,在删除一个项目后,还可以尝试记录适配器和数据源的长度。我猜这两个数字在某处不同步了。

 类似资料:
  • 问题内容: 我正在使用填充要在中列出的项目。一切正常。 但是现在我想保持项目列表的动态,即我希望能够在运行时从选择列表中添加/删除项目。但是,当我致电或时,我总是得到,即使该类的将这两种方法描述为可用于该预期目的也是如此。 这是一个错误,真的没有实现,还是我在这里遗漏了什么? 问题答案: 您可能使用普通的Java数组(例如,)初始化了适配器。尝试使用一些实现接口的东西(例如)。

  • 问题内容: 我早些时候发布了这个问题,并被告知将其设为SSCCE(如果我可以进行任何改进,随时告诉我):我想知道为什么当单击我的按钮“确认”时,旧方块消失了,重新绘制的方块不会出现在我的GUI(使用摆动制作)上。Squares类绘制200个间隔开的正方形,其中的ID(从String,0、1、2或3作为字符串)从另一个类获得(出于这个问题的目的,我们假设它始终为0,不包括该类)。为了澄清:Squar

  • 问题内容: 我的剧本 我的档案 我的输出 如果我在之后放一个空白行,则输出变为 任何人都知道如何解决此问题,所以不需要在末尾添加空白行? 问题答案: 发生的情况是,当 输入未以换行符终止 时,命令将失败。由于文件末尾缺少换行符,因此失败,因此将跳过循环的最后一次迭代。 如果您不想/不能确保输入文件的末尾有换行符,可以将您的文件与进行分组,以使输入的 外观 以换行符终止,例如: 或像这样:

  • 我试图使一个客户端-服务器包成一个应用程序。因此,当应用程序打开时,服务器会自动进入待机/监听模式。问题是当运行服务器套接字时,它直到之后才显示gui。我希望gui和服务器套接字同时发生。 我已经注释掉了代码行,它按照预期工作,直到 我读过关于线程来解决这个问题的文章,但是我看到的例子都没有给出足够清晰的答案。我对python和编程还是相当陌生的。谢啦

  • 包装呈现值;导入java。util。扫描仪; 公共类PresentValue{ }问题是写一个方法presentValue来执行此计算。该方法应接受未来值、年利率和年数作为参数。它应该返回现值,即您今天需要存入的金额。在一个程序中演示该方法,该程序允许用户试验公式项的不同值。 这里是公式P=F/(1r)^2

  • 我使用fiddler监控一个简单的html内容从一个PHP文件运行在localhost。但是每当我按f5刷新页面(浏览器)时,在fiddler中有时整个web会话的字体变成蓝色,即当它实际显示内容(html)时,相反的情况发生在web会话是灰色的时候,它不显示html内容。 注意:始终显示请求/响应标题,这仅用于内容。我还尝试了点技巧(“:80”)并从localhost切换到127.0。0.1.