2

我正在实现一个需要由活动显示并由用户修改(添加项目、删除项目、排序)的列表。目前我有两个不同的类 - 活动类和列表类,它具有列表上的所有操作。但是,活动类将需要访问列表以适应和显示它,并且复制活动列表或公开列表似乎有点笨拙。我觉得我可能不理解哪些活动是正确的——我的两个班级真的应该是一个班级吗?我认为活动主要针对 UI,而不是用于修改底层数据结构。

4

3 回答 3

3

活动是 Android 的主要构建块,您在应用程序中看到的所有不同屏幕都是活动。您应该了解,并非所有Java Classes在您的 Android 应用程序中使用的都是活动(只有那些是活动的 Java 类extends Activity)。

不是 Activity 的 Java 类(在您的代码中使用)可以是简单Data Models的 、Custom AdaptersCustom ViewsDatabase HandlersServices等等。

所有这些 Java 文件都与 Activity 类分开使用,以提供模块化并通过在单个 Activity 类中实现所有功能来避免造成混乱和缺陷。

您在 Activity 类中使​​用这些其他 Java 类的实例(或静态使用它们)。

对于显示简单列表,您可以使用ListView小部件,并且您实际上不需要单独的类来实现它。同样,如果您准备实现具有删除、添加、更新等功能的 ListView。那么自定义 ListView 是您可以使用的替代选项。

您不能在单个 Activity 类中实现自定义列表视图,您将需要 a Custom Adapter Class、 aCustom Data Model Class和其他相关类来实现它。

以下是一些用于实现简单和自定义 ListViews 的有用教程列表:

  1. Vogella 的 ListView Tut
  2. 开放教程
  3. 安卓示例 1
  4. 安卓示例 2

我希望这有帮助。

于 2013-09-22T04:55:49.593 回答
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. 让您的 Activity 处理列表中的添加或删除没有什么笨拙的。


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.

就像我说的,看看什么是单例实例。通过创建一个包含列表的类,在多个活动中共享您的列表。公开列表。这样,您就可以共享列表并且不会复制它。请记住:如果您多次复制数据。让它们保持同步将是一个难以破解的难题。

于 2013-09-22T04:50:45.147 回答
2

这样想吧。您的 oncreate 被调用一次。如果您需要在列表中完成任务,它们很可能会出现在您的 onItemClick、onItemLongClick 等事件中。发生这种情况时,您应该调用在相同活动中编码的 AsyncTask,以便 onPostExecute 可以修改其 UI 元素和列表。下面的一些例子。

请注意,下面的代码已大大减少,请原谅语法

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;
    }

}
于 2013-09-22T05:10:23.727 回答