0

How I can create a list view with 4 subitems which can contain Name, Phone,Mobile,Email

I am very new android learner

Ex:

Name 1
Ph:123456
Mo:123456789
email:example@example.com
--------------------------
Name 2
Ph:123456
Mo:123456789
email:example@example.com
--------------------------
Name 3
Ph:123456
Mo:123456789
email:example@example.com
--------------------------

Here is My Code which show one line as each list Item GMOFragment.java

import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import com.rupomkhondaker.sonalibank.adapter.PhoneListAdapter;
import com.rupomkhondaker.sonalibank.model.ContactItem;


import java.io.Serializable;
import java.util.ArrayList;

public class GMOFragment extends android.app.Fragment {
    public GMOFragment(){}


    private ArrayList<ContactItem> phoneItems;
    private PhoneListAdapter adapters;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_gmo, container, false);



        ArrayList<ContactItem> listData = getListData();

        final ListView listView = (ListView) rootView.findViewById(R.id.gmolistView);
        listView.setAdapter(new PhoneListAdapter(getActivity(), listData));

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> a, View v, int position, long id) {
                ContactItem newsData = (ContactItem) listView.getItemAtPosition(position);

                Toast.makeText(getActivity(), "Selected :" + " " + newsData, Toast.LENGTH_LONG).show();
                Intent in = new Intent(getActivity(), ContactDetail.class);
                // sending data to new activity

      //!!! I NEED HELP HERE !!!!

                //
                startActivity(in);
            }
        });


        return rootView;
    }

  private ArrayList<ContactItem> getListData() {
        ArrayList<ContactItem> listMockData = new ArrayList<ContactItem>();
        String[] names = getResources().getStringArray(R.array.gmo_name_list);
        String[] phones = getResources().getStringArray(R.array.gmo_ph_list);
        String[] mobiles = getResources().getStringArray(R.array.gmo_mob_list);
        String[] emails = getResources().getStringArray(R.array.gmo_email_list);

        for (int i = 0; i < names.length; i++) {
            ContactItem newsData = new ContactItem();
            newsData.setName(names[i]);
            newsData.setPhone(phones[i]);
            newsData.setMobile(mobiles[i]);
            newsData.setEmail(emails[i]);

            listMockData.add(newsData);
        }
        return listMockData;
    }
}

also How to pass the Item and sub-item Data to next Activity ContactDetailActivity.class

Here is the code where I am trying to view data

import android.app.Activity;
import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.TextView;


public class ContactDetailActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.fragment_service_details);

        TextView txtName = (TextView) findViewById(R.id.conName);
        TextView txtPhone = (TextView) findViewById(R.id.conPhone);
        TextView txtMobile = (TextView) findViewById(R.id.conMobile);
        TextView txtEmail = (TextView) findViewById(R.id.conEmail);


        Intent i = getIntent();
        // getting attached intent data
        String name = i.getStringExtra("KEY_DATA");
        String phone = i.getStringExtra("KEY_DATA2");
        String mobile = i.getStringExtra("KEY_DATA3");
        String email = i.getStringExtra("KEY_DATA4");
        // displaying selected contact name
        txtName.setText(name);
        txtPhone.setText(phone);
        txtMobile.setText(mobile);
        txtEmail.setText(email);

    }

}
Firefog
  • 2,532
  • 5
  • 31
  • 68
  • Try to check [this post][1] and Follow the tutorials answered by @Varundroid [1]: http://stackoverflow.com/questions/16333754/how-to-customize-listview-using-baseadapter – DreamBigAlvin Sep 23 '15 at 02:04
  • Can anyone help me with above I mention `//!!! I NEED HELP HERE !!!!` – Firefog Sep 23 '15 at 07:18

1 Answers1

2

You need to create your own custom adapter and custom view.

Check out the following tutorials -

Tutorial 1

Tutorial 2

Let me know If you having trouble understanding the concept.

Here is a working code -

Custom Adapter -

public class CustomAdapter extends ArrayAdapter<CustomObject> {

    public CustomAdapter(Context context, List<CustomObject> objects) {
        super(context, -1, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        View view = convertView;
        if (view == null) {
            view = View.inflate(getContext(), R.layout.list_view_item, null);
            viewHolder = new ViewHolder();
            viewHolder.setView(view);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }

        viewHolder.mName.setText(getItem(position).getName());
        viewHolder.mPhone.setText(getItem(position).getPhone());
        viewHolder.mMobile.setText(getItem(position).getMobile());
        viewHolder.mEmail.setText(getItem(position).getEmail());

        return view;
    }

    private class ViewHolder {

        public TextView mName;
        public TextView mPhone;
        public TextView mMobile;
        public TextView mEmail;

        public void setView(View view) {
            mName = (TextView) view.findViewById(R.id.textView);
            mPhone = (TextView) view.findViewById(R.id.textView2);
            mMobile = (TextView) view.findViewById(R.id.textView3);
            mEmail = (TextView) view.findViewById(R.id.textView4);
            view.setTag(this);
        }

    }
}

Custom Object -

public class CustomObject implements Parcelable {

    public String mName;
    public String mPhone;
    public String mMobile;
    public String mEmail;

    public CustomObject(String name, String phone, String mobile, String email) {
        mName = name;
        mPhone = phone;
        mMobile = mobile;
        mEmail = email;
    }

    private CustomObject(Parcel parcel) {
        readFromParcel(parcel);
    }

    public String getName() {
        return mName;
    }

    public void setName(String name) {
        mName = name;
    }

    public String getPhone() {
        return mPhone;
    }

    public void setPhone(String phone) {
        mPhone = phone;
    }

    public String getMobile() {
        return mMobile;
    }

    public void setMobile(String mobile) {
        mMobile = mobile;
    }

    public String getEmail() {
        return mEmail;
    }

    public void setEmail(String email) {
        mEmail = email;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mName);
        dest.writeString(mPhone);
        dest.writeString(mMobile);
        dest.writeString(mEmail);
    }

    private void readFromParcel(Parcel parcel) {
        mName = parcel.readString();
        mPhone = parcel.readString();
        mMobile = parcel.readString();
        mEmail = parcel.readString();
    }

    public static final Creator<CustomObject> CREATOR = new Creator<CustomObject>() {
        @Override
        public CustomObject createFromParcel(Parcel source) {
            return new CustomObject(source);
        }

        @Override
        public CustomObject[] newArray(int size) {
            return new CustomObject[0];
        }
    };
}

Your Activity -

public class MainActivity extends Activity {


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

        ListView listView = (ListView) findViewById(R.id.listView);

        ArrayList<CustomObject> customObjects = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            CustomObject customObject = new CustomObject("Name", "Phone", "Mobile", "Email");
            customObjects.add(customObject);
        }

        CustomAdapter customAdapter = new CustomAdapter(this, customObjects);
        listView.setAdapter(customAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            CustomObject object = customAdapter.getItem(position);
            Intent intent = new Intent(this, NextActivity.class);
            intent.putExtra("Item", customObjects);
            startActivity(intent);
        }
    });
    }

}

Custom View (list_view_item.xml) -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:id="@+id/textView"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:id="@+id/textView2"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:id="@+id/textView3"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:id="@+id/textView4"/>
</LinearLayout>

activity_main.xml -

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:paddingTop="@dimen/activity_vertical_margin"
                android:paddingBottom="@dimen/activity_vertical_margin"
                tools:context=".MainActivity">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

If anything doesn't make sense, let me know, I'll explain it to you.

Varundroid
  • 8,802
  • 13
  • 61
  • 90
  • Thank you for the tutorials. I am very new so can you please help to implement your method with my code ? – Firefog Sep 23 '15 at 02:00
  • `CustomObject("Abc", "Abc", "Abc", "Abc");` STAND FOR ? – Firefog Sep 23 '15 at 03:17
  • How to set with my data source ` ArrayList> data; private String[] gmoString,gmophItem;gmomobItem;gmomailItem;` Instead of CustomObject("Abc", "Abc", "Abc", "Abc"); – Firefog Sep 23 '15 at 04:05
  • Do you have any experience with Java or any other programming language? I am asking because knowing that will make me able to help you little better. – Varundroid Sep 23 '15 at 05:47
  • I have updated my answer. CustomObject("Abc", "Abc", "Abc", "Abc"); will create a new instance of CustomObject where first param stands for name, second stands for phone, third for mobile and fourth for email. You have four values getting passed between classes and Activities so making a custom object makes more sense here which will remove the complexity from your code by eliminating the need of using HashMap and other complex data structure classes. – Varundroid Sep 23 '15 at 06:30
  • Also I made the CustomObject parcelable so it can be passed easily using Intent. – Varundroid Sep 23 '15 at 06:31
  • I have update the Question above and your concept works. Could you please help me with that intent.....its not working. – Firefog Sep 23 '15 at 07:06