2016-06-24 2 views
2

Я создаю много edittext и texviews программно и помещаю их в tablelayout. Это мой кодПропущено 148 кадров! Приложение может делать слишком много работы над своей основной нитью, Android?

private EditText[] etAgreedVolume, etAgreedSaleParty, etAgreedSalesMgr; 

private void createOrderTable(ArrayList<POJOOrder> orderList) { 
    etAgreedVolume = new EditText[orderList.size()]; 
    etAgreedSaleParty = new EditText[orderList.size()]; 
    etAgreedSalesMgr = new EditText[orderList.size()]; 
    int maxLength = 3; 
    InputFilter[] FilterArray = new InputFilter[1]; 
    FilterArray[0] = new InputFilter.LengthFilter(maxLength); 

    for (int i = 0; i < orderList.size(); i++) { 
     TableRow tableRow = new TableRow(getActivity()); 
     tableRow.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT)); 

     TextView tvItem = new TextView(getActivity()); 
     tvItem.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT)); 
     tvItem.setText(orderList.get(i).getBrandWith_SKU()); 
     tvItem.setTextColor(Color.parseColor("#2E3B41")); 
     tvItem.setGravity(Gravity.CENTER); 
     tvItem.setPadding(10, 10, 10, 10); 
     tvItem.setBackgroundResource(R.drawable.rectangle_grey); 

     TextView tvPlannedVolume = new TextView(getActivity()); 
     tvPlannedVolume.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT)); 
     tvPlannedVolume.setText(orderList.get(i).getPlannedVolume() + " CS"); 
     tvPlannedVolume.setTextColor(Color.parseColor("#2E3B41")); 
     tvPlannedVolume.setGravity(Gravity.CENTER); 
     tvPlannedVolume.setPadding(10, 10, 10, 10); 
     tvPlannedVolume.setBackgroundResource(R.drawable.rectangle_grey); 

     LinearLayout linearLayout1 = new LinearLayout(getActivity()); 
     linearLayout1.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT)); 
     linearLayout1.setOrientation(LinearLayout.HORIZONTAL); 

     TextView tvPlannedSalesParty = new TextView(getActivity()); 
     tvPlannedSalesParty.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 1f)); 
     tvPlannedSalesParty.setText(orderList.get(i).getPlannedSalesPromoParty() + ""); 
     tvPlannedSalesParty.setTextColor(Color.parseColor("#2E3B41")); 
     tvPlannedSalesParty.setGravity(Gravity.CENTER); 
     tvPlannedSalesParty.setPadding(10, 10, 10, 10); 
     tvPlannedSalesParty.setBackgroundResource(R.drawable.rectangle_grey); 

     TextView tvPlannedSalesMgr = new TextView(getActivity()); 
     tvPlannedSalesMgr.setLayoutParams(new TableRow.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 1f)); 
     tvPlannedSalesMgr.setText(orderList.get(i).getPlannedSalesPromoMgr() + ""); 
     tvPlannedSalesMgr.setTextColor(Color.parseColor("#2E3B41")); 
     tvPlannedSalesMgr.setGravity(Gravity.CENTER); 
     tvPlannedSalesMgr.setPadding(10, 10, 10, 10); 
     tvPlannedSalesMgr.setBackgroundResource(R.drawable.rectangle_grey); 

     linearLayout1.addView(tvPlannedSalesParty); 
     linearLayout1.addView(tvPlannedSalesMgr); 

     etAgreedVolume[i] = new EditText(getActivity()); 
     etAgreedVolume[i].setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT)); 
     etAgreedVolume[i].setTextColor(ContextCompat.getColor(getActivity(), android.R.color.black)); 
     etAgreedVolume[i].setGravity(Gravity.CENTER); 
     etAgreedVolume[i].setHintTextColor(Color.parseColor("#888888")); 
     etAgreedVolume[i].setHint("0"); 
     etAgreedVolume[i].setPadding(10, 10, 10, 10); 
     etAgreedVolume[i].setBackgroundResource(R.drawable.rectangle_grey); 
     etAgreedVolume[i].setInputType(InputType.TYPE_CLASS_NUMBER); 
     etAgreedVolume[i].addTextChangedListener(watcherAgreedVolume); 
     etAgreedVolume[i].setFilters(FilterArray); 

     LinearLayout linearLayout2 = new LinearLayout(getActivity()); 
     linearLayout2.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT)); 
     linearLayout2.setOrientation(LinearLayout.HORIZONTAL); 

     etAgreedSaleParty[i] = new EditText(getActivity()); 
     etAgreedSaleParty[i].setLayoutParams(new TableRow.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 1f)); 
     etAgreedSaleParty[i].setTextColor(ContextCompat.getColor(getActivity(), android.R.color.black)); 
     etAgreedSaleParty[i].setGravity(Gravity.CENTER); 
     etAgreedSaleParty[i].setHintTextColor(Color.parseColor("#888888")); 
     etAgreedSaleParty[i].setHint("0"); 
     etAgreedSaleParty[i].setPadding(10, 10, 10, 10); 
     etAgreedSaleParty[i].setBackgroundResource(R.drawable.rectangle_grey); 
     etAgreedSaleParty[i].setInputType(InputType.TYPE_CLASS_NUMBER); 
     etAgreedSaleParty[i].addTextChangedListener(watcherAgreedVolume); 
     etAgreedSaleParty[i].setFilters(FilterArray); 

     etAgreedSalesMgr[i] = new EditText(getActivity()); 
     etAgreedSalesMgr[i].setLayoutParams(new TableRow.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 1f)); 
     etAgreedSalesMgr[i].setTextColor(ContextCompat.getColor(getActivity(), android.R.color.black)); 
     etAgreedSalesMgr[i].setGravity(Gravity.CENTER); 
     etAgreedSalesMgr[i].setPadding(10, 10, 10, 10); 
     etAgreedSalesMgr[i].setHintTextColor(Color.parseColor("#888888")); 
     etAgreedSalesMgr[i].setHint("0"); 
     etAgreedSalesMgr[i].setBackgroundResource(R.drawable.rectangle_grey); 
     etAgreedSalesMgr[i].setInputType(InputType.TYPE_CLASS_NUMBER); 
     etAgreedSalesMgr[i].addTextChangedListener(watcherAgreedVolume); 
     etAgreedSalesMgr[i].setFilters(FilterArray); 

     linearLayout2.addView(etAgreedSaleParty[i]); 
     linearLayout2.addView(etAgreedSalesMgr[i]); 

     tableRow.addView(tvItem); 
     tableRow.addView(tvPlannedVolume); 
     tableRow.addView(linearLayout1); 
     tableRow.addView(etAgreedVolume[i]); 
     tableRow.addView(linearLayout2); 

     tableLayout.addView(tableRow); 
    } 
} 

Эта страница мое приложение становится слишком медленным. Иногда даже ANR происходит из-за тяжелой работы. Как я могу сделать его гладким.

+0

Мне кажется, что вы должны использовать RecyclerView вместо TableView. RecyclerView будет создавать только те виды, которые отображаются на экране, и, прокручивая их, перерабатывает их. Вы избегаете этого огромного количества работы, см. – Budius

+0

, рассматривая использование RxJava для создания всех видов или использования RecyclerView. –

ответ

-2

Обновить Ваше отношение к отдельной Uithread образца:

private void runThread() { 

new Thread() { 
    public void run() { 
     while (/*your condition*/) { 
      try { 
       runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         //update your views here 
        } 
       }); 

      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}.start(); 
} 

если вы обновляете ваши мнения, которые в вашем случае много, основной поток будет делать много работы, что приведет к пропуску кадров и ошибкам ANR

0

Вариант 1

Создать AsyncTask и делать всю обработку там, наконец установить элементы макета в onPostExecute из AsyncTask. Кроме того, вы можете показать ProgressBar во время выполнения вашего AsyncTask и уволить его в onPostExecute.

Прокрутите вниз до субтитров «4 шага» в AsyncTask documentation, чтобы лучше понять это решение.

Вариант 2

Создание XML-файла (например, myTableRow.xml), который держит ваш TableRow со всеми своими детьми, установить все общие параметры, то есть параметры, которые не зависят от iterator integer i. Таким образом, в основном вы создаете шаблон своего TableRow, общий для всех.

Тогда в for Loop все, что осталось сделать, это: Надуйте myTableRow.xml для каждой итерации, установите остальные параметры (в зависимости от i) и, наконец, добавить его к tableLayout.

Примечание: Это должно быть возможно уже добавить свои EditText взгляды etAgreedVolume[i], etAgreedSaleParty[i] и etAgreedSalesMgr[i] в файл XML (т.е. ваш TableRow шаблон), несмотря на их будучи зависимыми от i. Я предлагаю вам сделать это, просто создав (стандартный) EditText просмотров, после того как вы надули TableRow, вы можете получить эти EditTexts и добавить их в массив.

Я не могу гарантировать, что «Вариант 2» будет работать быстрее или более гладко, однако в большинстве случаев раздувание макета происходит быстрее, чем создание макета с использованием жестко закодированного java.

+0

@WISHY Я обновил свой ответ с помощью другого варианта – REG1

0

Пришлось использовать listView для создания представлений. Tablelayout не может хранить эти огромные данные.

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

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