2013-09-22 4 views
2

Я реализую список, который должен отображаться в результате действия и изменен (добавлять элементы, удалять элементы, сортировать) пользователем. В настоящее время у меня есть два разных класса - класс активности и класс списка, который имеет все операции в списке. Тем не менее, класс активности будет нуждаться в доступе к списку, чтобы адаптировать и отображать его, и кажется, что это неудобно дублировать список для активности или сделать список общедоступным. У меня такое чувство, что я не понимаю, какие действия правильны - должны ли мои два класса быть одним классом? Я предположил, что действия были в основном для пользовательского интерфейса, а не для изменения базовой структуры данных.Confused о действиях и классах

+2

Я не думаю, что кто-нибудь может ответить без примера кода или то, что вы пытаетесь сделать :) – davidkonrad

+1

@davidkonrad Check мой ответ. Посмотрите, нужны ли улучшения. :) –

+1

+1 для улучшения вашего вопроса :) – davidkonrad

ответ

2

I'm implementing a list which needs to be displayed by an activity and modified (add items, remove items, sort) by the user.

Вы можете делать простые операции, определенные в интерфейсе List<T> как оные, Вы можете написать пользовательский Comparator<T> для выполнения операций сортировки удалить, и т.д.. Затем используйте метод Collections.sort(), чтобы выполнить свою работу.


Currently I have two different classes - the activity class and the list class which has all the operations on the list.

Это зависит от многого. Обычно я предпочитаю делать одиночный экземпляр списка и позволять моей активности изменять его при обратных вызовах от ListView. Нет ничего неуклюже в том, чтобы позволить вашей Деятельности обрабатывать добавление или удаление из списка.


However, the activity class is going to need access to the list in order to adapt and display it, and it seems kind of clumsy to either duplicate the list for the activity or make the list public.

Как я уже сказал, посмотрите, какой Singleton Instance есть. Поделитесь своим списком в нескольких действиях, создав класс, в котором есть список. Объявите публичный список. Таким образом, вы делитесь списком и не дублируете его. Помните: если вы дублируете данные несколько раз. держать их в синхронизации, будет жестким орешком, чтобы взломать.

3

Деятельность - основные строительные блоки Android, все различные экраны, которые вы видите в своем приложении, - Activities. Вы должны понимать, что не все Java Classes, используемые в вашем приложении для Android, - это действия (только те Java-классы, что extends Activity - это действия).

Java-классы, которые не активность (используется в вашем коде) может быть просто обычная Data Models, Custom Adapters, Custom Views, Database Handlers, Services, и так далее.

Все эти файлы Java используются отдельно от класса активности для обеспечения модульности и предотвращения создания беспорядка и недостатка путем реализации всей функциональности в одном классе активности.

Вы используете экземпляры этих других классов Java (или используете их статически) в своем классе активности.

Для отображения простого списка вы можете использовать виджет ListView, и вам не нужен отдельный класс для его реализации. Аналогично, если вы готовитесь к внедрению ListView с такими функциями, как «Удалить», «Добавить», «Обновить» и т. Д. Затем Custom ListView является альтернативным вариантом, который вы можете использовать.

Вы не можете реализовать представление пользовательского списка в одном классе деятельности, вам понадобится Custom Adapter Class, Custom Data Model Class и другие связанные классы для его реализации.

Вот список некоторых полезных руководств для реализации простого и пользовательских ListViews:

  1. Vogella's ListView Tut
  2. The Open Tutorials
  3. Android Example 1
  4. Android Example 2

Надеюсь, это поможет.

2

Подумайте об этом так. Ваш oncreate вызывается один раз. Если вам нужны вещи, сделанные в списке, они, скорее всего, будут на ваших onItemClick, onItemLongClick любопытных событиях. И когда это произойдет, вы должны вызвать AsyncTask, закодированную в одном и том же действии, чтобы onPostExecute мог изменять свои элементы интерфейса и список. Ниже приведен пример.

Обратите внимание, приведенный ниже код был уменьшен Bigtime, поэтому извини синтаксиса

package com.taxeetaregistration; 


public class Bookings extends ListActivity implements OnClickListener, OnItemClickListener { 

    private static LayoutInflater inflater = null; 
    private LinkedList<BookingRecord> bookingRecord; 
    private ListView customerList; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.bookings); 
     Log.d("Taxeeta", "Entered BookingExperience"); 

     bookingRecord = new LinkedList<BookingRecord>(); 

     customerList = (ListView) findViewById(android.R.id.list); 
     customerList.setAdapter(new CustomerList()); 
     customerList.setOnItemClickListener(this); 

     getBookings = new GetBookings(); 
     getBookings.execute(); 
    } 

    public class CustomerList extends BaseAdapter implements OnClickListener { 

     public View getView(int position, View convertView, ViewGroup parent) { 
      if (convertView == null || convertView.getTag() == null) { 
       convertView = inflater.inflate(R.layout.bookingresponse_row, null); 
       final CustomerViewHolder viewHolder = new CustomerViewHolder(); 
       viewHolder.customerRow = (LinearLayout) convertView.findViewById(R.id.customerRow); 
       viewHolder.customerName = (TextView) convertView.findViewById(R.id.customerName); 
       viewHolder.customerPhoneNumber = (TextView) convertView 
         .findViewById(R.id.customerPhoneNumber); 

       convertView.setTag(viewHolder); 
      } 
      // Setting all values in listview 
      String temp = bookingRecord.get(position).customer.getFullName(); 
      ((CustomerViewHolder) (convertView.getTag())).customerName.setText(temp); 

      temp = bookingRecord.get(position).customer.getPhoneNumber(); 
      ((CustomerViewHolder) (convertView.getTag())).customerPhoneNumber.setText(temp); 

      return convertView; 
     } 

    public class GetBookings extends AsyncTask<Object, Integer, Object> { 
     @Override 
     protected Object doInBackground(Object... params) { 
      connectToServer(); 

        //Do all network related work here, and update 
     publishProgress(j); 
       } 
      } 
      return null; 
     } 

     @Override 
     public void onPostExecute(Object result) { 
      super.onPostExecute(result); 
      if (bookingRecord != null && bookingRecord.size() > 0) { 
       busy.setVisibility(View.GONE); 
       ((BaseAdapter) customerList.getAdapter()).notifyDataSetChanged(); 

      } else { 
       progressBarUpper.setVisibility(View.GONE); 
       Log.d("Taxeeta", "No cabbies found"); 
      } 
     } 

     @Override 
     protected void onProgressUpdate(Integer... i) { 
      super.onProgressUpdate(i); 
      boolean found = false; 
      customersFound.setText("" + totalCabbiesSubscribed); 
      BookingRecord newRecord = new BookingRecord(); 
     newRecord.customerJourney = customerJourney; 
     newRecord.customer = customer; 

     bookingRecord.addLast(newRecord); 
      customersConfirmed.setText("" + bookingRecord.size()); 
     } 
    } 

    private class CustomerViewHolder { 
     public LinearLayout customerRow; 
     public TextView customerName; 
     public TextView customerPhoneNumber; 
     public TextView customerFrom, customerTo; 
     public ListView cabbieList; 
     public float distanceFromCustomer = -1.0f; 
    } 

    public class BookingRecord { 
     public BookingRecord() { 
      cabbies = new ArrayList<CabbieDetails>(); 
     } 

     public IJourneyDetails customerJourney; 
     public IUserDetails customer; 
     public SearchResultsConcrete cabbieList; 
     public ArrayList<CabbieDetails> cabbies; 
    } 

}