evrencoskun / TableView

TableView is a powerful Android library for displaying complex data structures and rendering tabular data composed of rows, columns and cells.
MIT License
3.14k stars 459 forks source link

oncreateview holders are not calling #135

Open Sorwar-Hosen-Mostafa opened 6 years ago

Sorwar-Hosen-Mostafa commented 6 years ago

in the custom adapter the oncreateviewholders are not calling thus data are not showing in the table view.

This is my adapter

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.evrencoskun.tableview.adapter.AbstractTableAdapter;
import com.evrencoskun.tableview.adapter.recyclerview.holder.AbstractViewHolder;
import com.gdm.tablelayout.model.CellModel;
import com.gdm.tablelayout.model.ColumnHeaderModel;
import com.gdm.tablelayout.model.RowHeaderModel;

public class MyTableViewAdapter extends AbstractTableAdapter <ColumnHeaderModel, RowHeaderModel, CellModel> {

    public MyTableViewAdapter(Context context) {
        super(context);
    }

    @Override
    public AbstractViewHolder onCreateCellViewHolder(ViewGroup parent, int viewType) {
        // Get cell xml layout
        View layout = LayoutInflater.from(mContext).inflate(R.layout.tableview_cell_layout,
                parent, false);
        // Create a Custom ViewHolder for a Cell item.
        return new MyCellViewHolder(layout);
    }
    @Override
    public AbstractViewHolder onCreateColumnHeaderViewHolder(ViewGroup parent, int viewType) {
        // Get Column Header xml Layout
        View layout = LayoutInflater.from(mContext).inflate(R.layout
                .tableview_column_header_layout, parent, false);

        // Create a ColumnHeader ViewHolder
        return new MyColumnHeaderViewHolder(layout);
    }
    @Override
    public AbstractViewHolder onCreateRowHeaderViewHolder(ViewGroup parent, int viewType) {
        View layout = LayoutInflater.from(mContext).inflate(R.layout
                .tableview_row_header_layout, parent, false);

        // Create a Row Header ViewHolder
        return new MyRowHeaderViewHolder(layout);
    }

    //cell functionality
    @Override
    public void onBindCellViewHolder(AbstractViewHolder holder, Object cellItemModel, int columnPosition, int rowPosition) {
        CellModel cell = (CellModel) cellItemModel;
        // Get the holder to update cell item text
        MyCellViewHolder viewHolder = (MyCellViewHolder) holder;
        viewHolder.cell_textview.setText(cell.getData().toString());
        // If your TableView should have auto resize for cells & columns.
        // Then you should consider the below lines. Otherwise, you can ignore them.
        // It is necessary to remeasure itself.
        viewHolder.itemView.getLayoutParams().width = LinearLayout.LayoutParams.WRAP_CONTENT;
        viewHolder.cell_textview.requestLayout();
    }
    class MyCellViewHolder extends AbstractViewHolder {

        public final TextView cell_textview;

        public MyCellViewHolder(View itemView) {
            super(itemView);
            cell_textview = (TextView) itemView.findViewById(R.id.cell_data);
        }
    }

    //columnFunctinatily

    @Override
    public void onBindColumnHeaderViewHolder(AbstractViewHolder holder, Object columnHeaderItemModel, int columnPosition) {
        ColumnHeaderModel columnHeader = (ColumnHeaderModel) columnHeaderItemModel;

        // Get the holder to update cell item text
        MyColumnHeaderViewHolder columnHeaderViewHolder = (MyColumnHeaderViewHolder) holder;
        columnHeaderViewHolder.column_header_textView.setText(columnHeader.getData());

        // If your TableView should have auto resize for cells & columns.
        // Then you should consider the below lines. Otherwise, you can ignore them.

        // It is necessary to remeasure itself.
        columnHeaderViewHolder.column_header_container.getLayoutParams().width = LinearLayout
                .LayoutParams.WRAP_CONTENT;
        columnHeaderViewHolder.column_header_textView.requestLayout();
    }

    class MyColumnHeaderViewHolder extends AbstractViewHolder {

        public final TextView column_header_textView;
        public final LinearLayout column_header_container;

        public MyColumnHeaderViewHolder(View itemView) {
            super(itemView);
            column_header_textView = (TextView) itemView.findViewById(R.id.column_header_textView);
            column_header_container = itemView.findViewById(R.id.column_header_container);
        }
    }

    //Rowheader functionlity

    @Override
    public void onBindRowHeaderViewHolder(AbstractViewHolder holder, Object rowHeaderItemModel, int rowPosition) {
        RowHeaderModel rowHeader = (RowHeaderModel) rowHeaderItemModel;

        // Get the holder to update row header item text
        MyRowHeaderViewHolder rowHeaderViewHolder = (MyRowHeaderViewHolder) holder;
        rowHeaderViewHolder.row_header_textview.setText(rowHeader.getData());
    }

    class MyRowHeaderViewHolder extends AbstractViewHolder {

        public final TextView row_header_textview;

        public MyRowHeaderViewHolder(View itemView) {
            super(itemView);
            row_header_textview = (TextView) itemView.findViewById(R.id.row_header_textview);
        }
    }
    //

    @Override
    public View onCreateCornerView() {
        return LayoutInflater.from(mContext).inflate(R.layout.tableview_corner_layout, null, false);
    }

    @Override
    public int getColumnHeaderItemViewType(int position) {
        return 0;
    }
    @Override
    public int getRowHeaderItemViewType(int position) {
        return 0;
    }
    @Override
    public int getCellItemViewType(int position) {
        return 0;
    }

}

and i am calling this from my Main activity

ArrayList<String > columns = new ArrayList<>();
        columns.add("id");
        columns.add("name");
        columns.add("email");
        columns.add("phone");

        mRowHeaderList = new ArrayList<>();
        mColumnHeaderList = new ArrayList<>();
        mCellList = new ArrayList<>();

        for(int i = 0;i<3;i++){
            mRowHeaderList.add( new RowHeaderModel(String.valueOf(i)));
        }

        for(int i = 0;i<4;i++){
            mColumnHeaderList.add(new ColumnHeaderModel(columns.get(i).toString()));
        }

        for (int i =0;i<mRowHeaderList.size();i++){
            ArrayList<CellModel> cellModels = new ArrayList<>();
            cellModels.add(new CellModel("1-" + i, "125-96-5656"));          // "Id"
            cellModels.add(new CellModel("2-" + i, "robin"));        // "Name"
            cellModels.add(new CellModel("3-" + i, "dhaka"));    // "address"
            cellModels.add(new CellModel("4-" + i,"01622565456"));       // "phone"
            mCellList.add(cellModels);
        }

        TableView tableView = new TableView(MainActivity.this);

        MyTableViewAdapter adapter = new MyTableViewAdapter(MainActivity.this);

        // Set this adapter to the our TableView
        tableView.setAdapter(adapter);

        // Let's set datas of the TableView on the Adapter
        adapter.setAllItems(mColumnHeaderList, mRowHeaderList, mCellList);
evrencoskun commented 6 years ago

Hi @Sorwar-Hosen-Mostafa

At first glance, it looks normal to me. Is there any error message on your logs?

Sorwar-Hosen-Mostafa commented 6 years ago

hey @evrencoskun, thanks for your response, there is no errors on the error log. app is running fine but table view is not showing up. i tried to debug the code inside the adapter but the overridden methods are not calling except for the contractor and onCreateCornerView.

debug breakpoints are stopping only at the contractor and onCreateCornerView.

tuvirus commented 6 years ago

@Sorwar-Hosen-Mostafa , hello.

Your TableView variable should be finding the view of the table.

like: TableView t = findViewById(R.id.tableLayout);

It should show the table now, everything else is ok.