Before giving you answer just look at the Definitions
VIEW.INVISIBLE:
This view is invisible, but it still takes up space for layout purposes.
VIEW.GONE:
This view is invisible, and it doesn't take any space for layout purposes.
For better understanding look at this screen shots https://stackoverflow.com/a/23211042/4741746
Now come to the point You don't need two types of views just one type of view is enough means item view. What you need is make your costume adapter in that adapter create view for header at left side and item at right side like this let consider this as row_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="horizontal"
android:weightSum="2" >
<TextView
android:id="@+id/tv_receipt_label"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:padding="3dp"
android:text="Header"
android:textSize="@dimen/title_text_font_size" />
<TextView
android:id="@+id/tv_receipt_value"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:gravity="end"
android:padding="3dp"
android:text="item"
android:textSize="@dimen/title_text_font_size" />
</LinearLayout>
DataAdpater.java file is like
class DataAdapter extends BaseAdapter {
ArrayList<UserReadOnlyData> receiptFields;
Context context;
public DataAdapter(Context context, ArrayList<UserReadOnlyData> receiptFields) {
this.receiptFields = receiptFields;
this.context = context;
}
@Override
public int getCount() {
return this.receiptFields.size();
}
@Override
public UserReadOnlyData getItem(int position) {
return receiptFields.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@SuppressLint({ "ViewHolder", "InflateParams" })
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater receiptRowViewInflator = LayoutInflater
.from(context);
convertView = receiptRowViewInflator.inflate(
R.layout.row_layout, null);
TextView header = (TextView) convertView
.findViewById(R.id.tv_receipt_label);
TextView item = (TextView) convertView
.findViewById(R.id.tv_receipt_value);
UserReadOnlyData receiptConfig = receiptFields.get(position);
if(null!=receiptConfig.header&&receiptConfig.header.length()>0){
header.setText((null!=receiptConfig.header)?receiptConfig.header :"");
}else {
header.setVisibility(View.VISIBLE);
}
item.setText((null!=receiptConfig.item)?receiptConfig.item :"");
return convertView;
}
}
public class UserReadOnlyData{
String header;
String item;
public UserReadOnlyData(String lable,String value){
this.header =lable;
this.item =value;
}
}
Than set your adpter like
ArrayList<UserReadOnlyData> receiptFields= getYourValues();
DataAdapter adapter = new DataAdapter (mContext, receiptFields);
listView.setAdapter(adapter);