12/08/2018, 12:51

Tạo Custom Horizontal ListView

Thông thường chúng ta sẽ tạo list theo chiều dọc, tuy nhiên một số trường hợp cần tạo list các Item theo chiều ngang. Trong bài viết này mình sẽ sử dụng một lib là TwoWayView để tạo một Horizontal ListView một cách đơn giản, có thể tùy chỉnh được Adapter như ListView hay RecyclerView thông thường. ...

Thông thường chúng ta sẽ tạo list theo chiều dọc, tuy nhiên một số trường hợp cần tạo list các Item theo chiều ngang. Trong bài viết này mình sẽ sử dụng một lib là TwoWayView để tạo một Horizontal ListView một cách đơn giản, có thể tùy chỉnh được Adapter như ListView hay RecyclerView thông thường.

Link github: https://github.com/lucasr/twoway-view

Đầu tiên là add lib vào Project và sync lại project:

- dependencies {
    compile 'org.lucasr.twowayview:twowayview:0.1.4'
}

Sau khi thành công, để sử dụng đầu tiên là add TwoWayView vào file XML:

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

    <org.lucasr.twowayview.TwoWayView
        android:id="@+id/list_item"
        android:layout_gravity="center_vertical"
        style="@style/TwoWayView"
        android:layout_awidth="wrap_content"
        android:layout_height="50dp" />

</LinearLayout>

Tạo 1 style để khai báo kiểu Horizontal

<style name="TwoWayView">
        <item name="android:orientation">horizontal</item>
</style>

Tiếp theo là viết class MainActivity:

public class MainActivity extends Activity {

    private TwoWayView listItem;
    private ArrayList<String> listData;

    private String datas[] = {"Ha Noi", "Hai Phong", "Hai Duong", "Phu Tho", "Da Nang", "Nha Trang", "Thanh pho Ho Chi Minh",
                                "Thái Nguyên", "Hà Tĩnh", "Thanh Hóa", "Nghệ An", "Sóc Trăng", "Trà Vinh, Bạc Liêu", "Bến Tre",
                                "Hà Tây", "Hà Nam", };

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

        listItem = (TwoWayView)findViewById(R.id.list_item);
        listData = new ArrayList<>();

        createFakeDataForList();

        final ListViewAdapter mAdapter = new ListViewAdapter(this, listData);
        listItem.setAdapter(mAdapter);
    }

    private void createFakeDataForList() {
        for(int i = 0; i < datas.length; i++){
            listData.add(datas[i]);
        }
    }
}

Tiếp theo là tạo adapter, vì cái TwoWayView nó nhận Adapter là ListAdapter Screenshot from 2015-11-24 14:56:08.png

nên khi tạo class Adapter sẽ implement ListAdapter

public class ListViewAdapter implements ListAdapter {
    private ArrayList<String> listData;
    LayoutInflater inflater;

    public ListViewAdapter(Context context, ArrayList<String> listData){
        this.listData = listData;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public boolean areAllItemsEnabled() {
        return false;
    }

    @Override
    public boolean isEnabled(int position) {
        return false;
    }

    @Override
    public void registerDataSetObserver(DataSetObserver observer) {

    }

    @Override
    public void unregisterDataSetObserver(DataSetObserver observer) {

    }

    @Override
    public int getCount() {
        if(listData != null && !listData.isEmpty()){
            return listData.size();
        }
        return 0;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View rowView = convertView;

        if(rowView == null){
            rowView = inflater.inflate(R.layout.row_layout, parent, false);
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.layout = (LinearLayout) rowView.findViewById(R.id.layout);
            viewHolder.textItem = (TextView) rowView.findViewById(R.id.text_item);
            rowView.setTag(viewHolder);
        }

        ViewHolder holder = (ViewHolder) rowView.getTag();
        holder.textItem.setText(listData.get(position));
        if(position % 2 == 0){
            holder.layout.setBackgroundColor(Color.CYAN);
        }
        else {
            holder.layout.setBackgroundColor(Color.GREEN);
        }

        return rowView;
    }

    @Override
    public int getItemViewType(int position) {
        return 0;
    }

    @Override
    public int getViewTypeCount() {
        return listData.size();
    }

    @Override
    public boolean isEmpty() {
        return false;
    }

    private class ViewHolder {
        public LinearLayout layout;
        public TextView textItem;
    }
}

Tạo layout cho adapter (row_layout.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_awidth="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/layout"
    android:gravity="center">

    <TextView
        android:id="@+id/text_item"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:layout_awidth="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

Kết quả: Screenshot from 2015-11-24 15:53:22.png

Như vậy đã tạo được 1 Horizontal List một cách đơn giản với adapter để có thể tùy chỉnh

Tham khảo

https://github.com/lucasr/twoway-view

https://guides.codepath.com/android/implementing-a-horizontal-listview-guide#populating-data-into-twowayview

0