2013-02-21 6 views
0

Я ударился головой о стену, пытаясь решить эту проблему в течение некоторого времени. Я не опытный парень Android, поэтому его решение может быть очень простым. Это, как говорится, у меня есть следующий код:Пользовательский адаптер Listview Android

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

    // set user_type for Viewall 
    mUserType = 0; 

    lv_adminusersListContent.addFooterView(footerView); 
    mUsersAdapter = new AdminUsersAdapter(mUsersList, AdminUsers.this); 
    lv_adminusersListContent.setAdapter(mUsersAdapter); 

    getUsersList(); 

} 

private void getUsersList() { 

    if (UsefulFcts.isOnline(AdminUsers.this)) { 

     if (mThread != null && mThread.isAlive()) { 
      mThread.interrupt(); 
     } 

     mThread = new Thread() { 
      @Override 
      public void run() { 

       mHandler.post(new Runnable() { 

        @Override 
        public void run() { 
         pDialog = new ProgressDialog(AdminUsers.this); 
         pDialog.setMessage("Loading.. Please wait!"); 
         pDialog.setCancelable(false); 
         pDialog.show(); 
        } 
       }); 

       mUsersList.clear(); 
       mUsersList.addAll(mServiceManager.getUsersList(mUserType, 
         0 + "", AdminServiceManager.sHowManyToLoad)); 
       mArrayLength = mUsersList.size(); 

       Log.d("arrayLength", String.valueOf(mArrayLength)); 
       Log.d("total_results", 
         String.valueOf(ParserJSON.total_results)); 

       mHandler.post(new Runnable() { 

        @Override 
        public void run() { 

         // refresh listview 

         mUsersAdapter.notifyDataSetChanged(); 

         if (mArrayLength < ParserJSON.total_results) { 

          lv_adminusersListContent 
            .addFooterView(footerView); 

         } else if (mArrayLength >= ParserJSON.total_results) { 

          lv_adminusersListContent 
            .removeFooterView(footerView); 
         } 

         if (0 == mArrayLength) { 

          Toast.makeText(AdminUsers.this, 
            "No username found!", 
            Toast.LENGTH_SHORT).show(); 
         } 

         pDialog.dismiss(); 
        } 
       }); 
      } 
     }; 
     mThread.start(); 
    } else { 
     Toast.makeText(AdminUsers.this, "Internet connection required!", 
       Toast.LENGTH_LONG).show(); 
    } 
} 

@Override 
protected void linkUI() { 

    // begin load_more view 
    footerView = AdminUsers.this.getLayoutInflater().inflate(
      R.layout.loadmore, null); 

    btn_loadmore = (Button) footerView.findViewById(R.id.btn_loadmore); 
    // end load_more view 

    btn_adminusersViewall = (Button) findViewById(R.id.btn_adminusersViewall); 
    btn_adminusersAdmins = (Button) findViewById(R.id.btn_adminusersAdmins); 
    btn_adminusersClients = (Button) findViewById(R.id.btn_adminusersClients); 
    btn_adminusersDevs = (Button) findViewById(R.id.btn_adminusersDevs); 

    btn_adminAdd = (ImageButton) findViewById(R.id.btn_adminAdd); 

    lv_adminusersListContent = (ListView) findViewById(R.id.lv_adminusersListContent); 
} 

@Override 
protected void setAction() { 

    // begin Buttons UnderHeader 

    btn_adminusersViewall.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      UsefulFcts.setButtonClicked(btn_adminusersViewall, 
        btn_adminusersClients, btn_adminusersAdmins, 
        btn_adminusersDevs); 

      mUserType = 0; 

      mArrayLength = -1; 

      lv_adminusersListContent.removeFooterView(footerView); 

      getUsersList(); 

     } 
    }); 

    btn_adminusersClients.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      UsefulFcts.setButtonClicked(btn_adminusersClients, 
        btn_adminusersDevs, btn_adminusersAdmins, 
        btn_adminusersViewall); 

      mUserType = 1; 

      mArrayLength = -1; 

      // view.setVisibility(View.GONE); 

      getUsersList(); 
     } 
    }); 

    btn_adminusersDevs.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      UsefulFcts.setButtonClicked(btn_adminusersDevs, 
        btn_adminusersClients, btn_adminusersAdmins, 
        btn_adminusersViewall); 

      mUserType = 2; 

      mArrayLength = -1; 

      lv_adminusersListContent.removeFooterView(footerView); 

      getUsersList(); 
     } 
    }); 

    btn_adminusersAdmins.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      mUserType = 3; 

      mArrayLength = -1; 

      lv_adminusersListContent.removeFooterView(footerView); 

      getUsersList(); 
     } 
    }); 

    // end Buttons UnderHeader 

    btn_loadmore.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      mThread2 = new Thread() { 
       @Override 
       public void run() { 
        mHandler.post(new Runnable() { 

         @Override 
         public void run() { 

          progressBar = new ProgressDialog(
            AdminUsers.this); 
          progressBar 
            .setMessage("Loading more projects.. "); 
          progressBar.setCancelable(true); 
          progressBar.show(); 
         } 
        }); 

        mUsersList.addAll(mServiceManager.getUsersList(
          mUserType, String.valueOf(mArrayLength), 
          AdminServiceManager.sHowManyToLoad)); 

        mArrayLength = mUsersList.size(); 

        mHandler.post(new Runnable() { 

         @Override 
         public void run() { 

          mUsersAdapter.notifyDataSetChanged(); 

          if (mArrayLength >= ParserJSON.total_results) { 
           lv_adminusersListContent.removeFooterView(footerView); 
          } 
          progressBar.dismiss(); 
         } 
        }); 

       }; 
      }; 
      mThread2.start(); 
     } 
    }); 

Примечание: В основном я есть ListView содержание которого запрашивается от сервера в зависимости от кнопки (похожий на вкладку) Я нажатием (mUserType = 0/1/2/3). Я также использую кнопку Load More (footerView = простой макет с кнопкой). Все, кажется, работает нормально, но после того, как несколько раз «играть» с помощью кнопок (случайное число!) Он выходит из строя, за исключением следующего брошенной:

02-21 11:00:49.252: E/AndroidRuntime(11728): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131296461, class android.widget.ListView) with Adapter(class android.widget.HeaderViewListAdapter)] 

Итак, я посмотрел на код, но не видел никакого уведомления о просмотре списка "not on UI thread".

1. В чем проблема?

2. Нужно ли использовать 2 темы (mThread и mThread2), или я мог использовать тот же один, как свою работу следует начинать, когда другие концы (или не так ли?), И я должен заявить, они статичны или нет?

Также указывая на любые трюки «хорошей практики», которые я мог бы использовать в будущем, или «неправильные практики», которые я сделал, были бы очень благодарны!

PS. linkUI() и setAction() вызывается в super(). onCreate().

ответ

2

сообщение об ошибке кажется понятным: вы изменяете адаптер от mThread:

mUsersList.clear(); 
mUsersList.addAll(mServiceManager.getUsersList(mUserType, 
        0 + "", AdminServiceManager.sHowManyToLoad)); 

Вы можете попробовать что-то вроде этого:

  final List newUserList = mServiceManager.getUsersList(mUserType, 
        0 + "", AdminServiceManager.sHowManyToLoad); 

      mArrayLength = newUserList.size(); 

      Log.d("arrayLength", String.valueOf(mArrayLength)); 
      Log.d("total_results", 
        String.valueOf(ParserJSON.total_results)); 

      mHandler.post(new Runnable() { 

       @Override 
       public void run() { 
        mUsersList.clear(); 
        mUsersList.addAll(newUserList); 
        // refresh listview 

        mUsersAdapter.notifyDataSetChanged(); 
+0

Я благодарю вас за ваш быстрый и объективный ответ! Я оставлю эту тему активнее немного, возможно, некоторые мнения по моему второму вопросу и «Хорошие/неправильные практики», а затем я приму свой ответ! – DoruAdryan

Смежные вопросы