Tuesday, May 5, 2015

Android MVC pattern for listview


In this post, we will see how to implement custom listview in MVC pattern.

Steps to create custom listview using mvc pattern.

Step 1:  Create a listview in your layout xml

 <?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="wrap_content"  
   android:orientation="vertical" >  
    <ListView  
     android:id="@+id/lv_data"  
     android:layout_width="match_parent"  
     android:layout_height="wrap_content"  
     android:dividerHeight="1dp" >  
   </ListView>  
 </LinearLayout>  

Step 2:  Create data_list_item.xml  and add  it in layout folder.

<?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:id="@+id/tv_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

Step 3:  Create a init adapter method in your fragment or in activity.

public void initAdapter(List<User> users) {
        lvData = (ListView) rootView.findViewById(R.id.lv_data);
        
        DataListAdapter adapter = new DataListAdapter(users,getActivity());
        lvData.setAdapter(adapter);
    }
I have used fragment here.

Step 4:  create an Adapter , here we will create a DataListAdapter.java

public class DataListAdapter extends BaseAdapter {

    private List<User> users;
    private UserHolder holder;
    private Activity mActivity ;
    
    public DataListAdapter(List<User> users,Activity activity) {
        this.users = users;
        this.mActivity = activity;
    }

    @Override
    public int getCount() {
        return users.size();
    }

    @Override
    public Object getItem(int position) {
        return users.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView != null) {
            holder = (UserHolder) convertView.getTag();
        }else {
            holder = new UserHolder(mActivity);
            convertView = holder.getConvertView();
            convertView.setTag(holder);
        }
        
        holder.initializeData(users.get(position));
        holder.applyData();
        
        return convertView;
    }
}


Step 5:  Create a Viewholder , Here we will create UserHolder.java

public class UserHolder extends BaseViewHolder {

    private TextView tvData;
    private User userItem;

    public UserHolder(Activity activity) {
        super(activity);
    }

    @Override
    public View getConvertView() {
        mView = mLayoutInflater.inflate(R.layout.data_list_item, null);
        tvData = (TextView) mView.findViewById(R.id.tv_data);
        return mView;
    }

    @Override
    public void applyData() {
        tvData.setText(userItem.getFirstname());
    }

    @Override
    public void initializeData(Object data) {

        userItem = (User) data;
    }
}


Using above five steps we can create 3 different classes to follow MVC pattern.
ViewHolder inflate data_list_item.xml as list item As View
Adapter acts as a Controller.
MainActivity acts as a Model.


Happy coding !!!


No comments:

Post a Comment