代码之家  ›  专栏  ›  技术社区  ›  robinleathal

如何修复android中碎片的排序问题和数据显示?

  •  0
  • robinleathal  · 技术社区  · 8 年前

    我自己也在学习Android。现在,我正在学习碎片。在这里,我想托管联系人活动的片段。

    我有2个问题

    问题1: 细节片段未显示所有数据。

    例如,我的java类 新联系人(“Ron”、“Thal”、“+405-315-2827”、“ron@ronthal.com")

    名单上有姓塔尔的人。点击它应该显示名字、姓氏、电话和电子邮件。但它只显示名字,但问题2

    问题2: 我已经成功地在列表片段上按字母顺序排序姓氏。然而,当我在列表片段上使用排序列表时,它并没有在细节片段上显示正确的数据。详细片段显示了片段数据,顺序是我在纯java类中的顺序。它应该将相关数据显示到列表中。

    当我不排序时,会显示正确的数据,但在单击列表片段上的lastname时,细节片段上只有firstname。

    如何修复?我哪里弄错了?

    接触活动

    public class ContactActivity extends Activity implements ContactListFragment.ContactListListener{
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_contact);
    
        }
    
        @Override
        public void itemClicked(long id){
            //method also defined in the listener
    
            View fragmentContainer = findViewById(R.id.fragment_detail_container);
            if (fragmentContainer != null){
                ContactDetailsFragment detailsFragment = new ContactDetailsFragment();
                FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                detailsFragment.setContact(id);
                fragmentTransaction.replace(R.id.fragment_detail_container, detailsFragment);
                //fragmentTransaction.addToBackStack(null);
                fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                fragmentTransaction.commit();
            }
    
        }
    
    }
    

    联系人详细信息片段

    public class ContactDetailsFragment extends Fragment {
        private long contactId;
    
        public ContactDetailsFragment() {
            // Required empty public constructor
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            if (savedInstanceState != null){
                contactId = savedInstanceState.getLong("contactId");
            }
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
    
            return inflater.inflate(R.layout.fragment_contact_details, container, false);
        }
    
        @Override
        public void onStart(){
            super.onStart();
            View view = getView();
            if (view != null){
    
                TextView FNameText = (TextView) view.findViewById(R.id.textFName);
                Contact contact = myContact[(int) contactId];
                FNameText.setText(contact.getFName());
                TextView LNameText = (TextView) view.findViewById(R.id.textLName);
                LNameText.setText(contact.getLName());
                TextView PhoneText = (TextView) view.findViewById(R.id.textPhone);
                PhoneText.setText(contact.getPhone());
                TextView EmailText = (TextView) view.findViewById(R.id.textEmail);
                EmailText.setText(contact.getEmail());
    
            }
        }
        @Override
        public void onSaveInstanceState(Bundle savedInstanceState){
            savedInstanceState.putLong("contactId", contactId);
        }
    
        public void setContact(long id){
            this.contactId = id;
        }
    
    }
    

    public class ContactListFragment extends ListFragment {
    
        //ArrayAdapter<Contact> cAdapter;
        ArrayAdapter<String> cAdapter;
    
    
        interface ContactListListener{
            void itemClicked(long id);
        }
        //add listener to fragment
        private ContactListListener listener;
    
        public ContactListFragment() {
            // Required empty public constructor
        }
    
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
    
            //String[] lastname = new String[Contact.class]
            //cAdapter = new ArrayAdapter<>(inflater.getContext(), R.layout.fragment_contact_list, myContact);
    
            String[] lnames = new String[Contact.myContact.length];
            //String[] fnames = new String[Contact.myContact.length];
            for (int i = 0; i < lnames.length; i++){
                lnames[i] = Contact.myContact[i].getLName();
                //fnames[i] = myContact[i].getFName();
    
            }
    
    
            //ArrayAdapter<String> cAdapter;
            //ArrayAdapter<String> cAdapter;
    
            //cAdapter = new ArrayAdapter<>(inflater.getContext(), android.R.layout.simple_list_item_1, myContact);
            cAdapter = new ArrayAdapter<>(inflater.getContext(), android.R.layout.simple_list_item_1, lnames);
            //to sort alphabetically
            /*
            cAdapter.sort(new Comparator<Contact>() {
                @Override
                public int compare(Contact o1, Contact o2) {
                    return o1.toString().compareToIgnoreCase(o2.toString());
                }
            });
            */
    
            cAdapter.sort(new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
    
                    return o1.compareTo(o2);
                }
            });
    
            setListAdapter(cAdapter);
            cAdapter.notifyDataSetChanged();
    
            return super.onCreateView(inflater, container, savedInstanceState);
        }
        @Override
        public void onAttach(Activity activity){
            super.onAttach(activity);
            this.listener = (ContactListListener) activity;
        }
        @Override
        public void onListItemClick(ListView l, View v, int position, long id){
            if (listener != null){
                listener.itemClicked(id);
            }
        }
    }
    

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text=""
            android:id="@+id/textFName"
            />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text=""
            android:id="@+id/textLName"
            />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text=""
            android:id="@+id/textPhone"
            />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text=""
            android:id="@+id/textEmail"
            />
    </LinearLayout>
    

    联系人活动xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_contact"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:baselineAligned="false"
        tools:context="edu.uco.rawal.p5rabina.ContactActivity">
            <fragment
                class="edu.uco.rawal.p5rabina.ContactListFragment"
                android:layout_width="0dp"
                android:layout_weight ="1"
                android:layout_height="match_parent"
                android:id="@+id/contact_list_frag"/>
    
    
            <FrameLayout
                android:id="@+id/fragment_detail_container"
                android:layout_width="0dp"
                android:layout_weight="2"
                android:layout_height="match_parent"
                >
    
            </FrameLayout>
    
    </LinearLayout>
    

    联系人.java (纯java类)

    public class Contact {
        private String fname, lname, phone, email;
    
    
        public static final Contact[] myContact = {
    
                new Contact("Rabin", "Awal", "+405-315-0007", "rawal@yahoo.com"),
                new Contact("David", "Gilmour", "+405-315-2027", "david@gilmour.com"),
                new Contact("James", "Hetfield", "+405-315-2527", "james@metallica.com"),
                new Contact("Kirk", "Hammet", "+405-315-2995", "kirk@metallica.com"),
                new Contact("Tom", "Morello", "+405-315-2886", "tom@tommorello.com"),
                new Contact("Angus", "Young", "+405-315-2831", "angus@acdc.com.au"),
                new Contact("Ron", "Thal", "+405-315-2827", "ron@ronthal.com")
        };
    
    
    
        private Contact(String fname, String lname, String phone, String email){
            this.fname = fname;
            this.lname = lname;
            this.email = email;
            this.phone = phone;
        }
    
        public String getFName() {
            return fname;
        }
    
        public String getLName() {
            return lname;
        }
    
        public String getEmail() {
            return email;
        }
    
        public String getPhone() {
            return phone;
        }
        /*
    
        public void setFName(String fname) {
            this.fname = fname;
        }
    
        public void setLName(String lname) {
            this.lname = lname;
        }
    
        public void setPhone(String phone) {
            this.phone = phone;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
        */
    
        @Override
        public String toString() {
            //return super.toString();
    
    
            return  fname.toString();
            //return this.fname;
    
        }
    
    
    }
    

    非常感谢。

    1 回复  |  直到 8 年前
        1
  •  1
  •   OneCricketeer Gabriele Mariotti    8 年前

    它只显示名字

    在ListView中,这很有意义,因为 ArrayAdapter<String> toString 对象,即 return fname.toString(); return fname )

    如果您的意思是在细节片段中,那么在XML中,每个 TextView 理想情况下应该有 android:layout_height="wrap_content" 而不是 match_parent 。否则一个 文本框 占据整个屏幕。

    我已经成功地在列表片段上按字母顺序排序姓氏。

    好吧,那么我不确定问题是什么……也许你的意思是这就是问题所在?

    cAdapter.sort(new Comparator<Contact>() {
        @Override
        public int compare(Contact o1, Contact o2) {
            return o1.toString().compareToIgnoreCase(o2.toString());
        }
    });
    

    这里有两个Contact对象…如果要按姓氏排序,请这样做。

    cAdapter.sort(new Comparator<Contact>() {
        @Override
        public int compare(Contact c1, Contact c2) {
            return c1.getLName().compareToIgnoreCase(c2.getLName());
        }
    });
    

    关于此代码。

       String[] lnames = new String[Contact.myContact.length];
        //String[] fnames = new String[Contact.myContact.length];
        for (int i = 0; i < lnames.length; i++){
            lnames[i] = Contact.myContact[i].getLName();
            //fnames[i] = myContact[i].getFName();
    
        }
    

    ArrayAdapter<Contact> 如果要显示 Contact 而不仅仅是姓/名。

    我也不太确定是否使用 getView() 在内部 onStart() …我认为你应该使用 onCreateView onViewCreated .