I am using the following coverflow library: https://github.com/moondroid/CoverFlow
Each cover has its own framelayout. The buttons which I have added to the framelayout do not execute their onClick events. Specifically I have added an onClick event to the Apply button, however the onClick event gets executed when the Rating label is clicked and not when the Apply button is clicked. I am assuming that the layouts are being confused in some sense. I have tried multiple solutions from previous questions however without success.
When inflating the layout I do pass the parent view and set the attachToRoot parameter to false:
LayoutInflater inflater = (LayoutInflater) mContext.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rowView = inflater.inflate(R.layout.item_coverflow, parent, false);
Please see the detailed code below. To be clear, the button for illustration purposes has id buttonApply in the item_coverflow.xml and its onClick listener is assigned in CoverFlowAdapter.java. Help would be appreciated.Thank you.
I have added the custom coverflow element to a RelativeLayout:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_register"
android:layout_gravity="center"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:coverflow="http://schemas.android.com/apk/res-auto"
tools:context="za.co.xxx.xxx.VacancyActivity">
<it.moondroid.coverflow.components.ui.containers.FeatureCoverFlow
android:id="@+id/coverFlow"
android:layout_width="match_parent"
android:layout_height="match_parent"
coverflow:coverHeight="@dimen/cover_height"
coverflow:coverWidth="@dimen/cover_width"
coverflow:maxScaleFactor="1.5"
coverflow:reflectionGap="0px"
coverflow:rotationThreshold="0.5"
coverflow:scalingThreshold="0.5"
coverflow:spacing="0.6" />
</RelativeLayout>
The coverflow uses framelayouts for each view in the coverflow, where I have added the relevant buttons specifically button with id buttonApply is the case in point:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="@dimen/cover_width"
android:layout_height="@dimen/cover_height"
android:background="@color/black_transparent">
<TableLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
android:stretchColumns="0,1">
<TableRow>
<TextView
android:id="@+id/textViewPracticeNameLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/practice"
android:textColor="@color/white"
android:layout_column="0"
android:maxLines="4"/>
<TextView
android:id="@+id/textViewPracticeName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/not_available"
android:textColor="@color/white"
android:layout_column="1"
android:maxLines="4"/>
</TableRow>
<TableRow>
<TextView
android:id="@+id/textViewEmploymentTypeLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/practice"
android:textColor="@color/white"
android:layout_column="0"
android:maxLines="4"/>
<TextView
android:id="@+id/textViewEmploymentType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/not_available"
android:textColor="@color/white"
android:layout_column="1"
android:maxLines="4"/>
</TableRow>
<TableRow>
<TextView
android:id="@+id/textViewVacancyTypeLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/practice"
android:textColor="@color/white"
android:layout_column="0"
android:maxLines="4"/>
<TextView
android:id="@+id/textViewVacancyType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/not_available"
android:textColor="@color/white"
android:layout_column="1"
android:maxLines="4"/>
</TableRow>
<TableRow>
<TextView
android:id="@+id/textViewAddressLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/practice"
android:textColor="@color/white"
android:layout_column="0"
android:maxLines="4"/>
<TextView
android:id="@+id/textViewAddress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/not_available"
android:textColor="@color/white"
android:layout_column="1"
android:maxLines="4"/>
</TableRow>
<TableRow>
<TextView
android:id="@+id/textViewRatePerHourLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/practice"
android:textColor="@color/white"
android:layout_column="0"
android:maxLines="4"/>
<TextView
android:id="@+id/textViewRatePerHour"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/not_available"
android:textColor="@color/white"
android:layout_column="1"
android:maxLines="4"/>
</TableRow>
<TableRow>
<TextView
android:id="@+id/textViewStartDateLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/practice"
android:textColor="@color/white"
android:layout_column="0"
android:maxLines="4"/>
<TextView
android:id="@+id/textViewStartDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/not_available"
android:textColor="@color/white"
android:layout_column="1"
android:maxLines="4"/>
</TableRow>
<TableRow>
<TextView
android:id="@+id/textViewEndDateLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/practice"
android:textColor="@color/white"
android:layout_column="0"
android:maxLines="4"/>
<TextView
android:id="@+id/textViewEndDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/not_available"
android:textColor="@color/white"
android:layout_column="1"
android:maxLines="4"/>
</TableRow>
<TableRow>
<TextView
android:id="@+id/textViewDistanceTravelLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/practice"
android:textColor="@color/white"
android:layout_column="0"
android:maxLines="4"/>
<TextView
android:id="@+id/textViewDistanceTravel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/not_available"
android:textColor="@color/white"
android:layout_column="1"
android:maxLines="4"/>
</TableRow>
<TableRow>
<TextView
android:id="@+id/textViewTimeToTravelLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/practice"
android:textColor="@color/white"
android:layout_column="0"
android:maxLines="4"/>
<TextView
android:id="@+id/textViewTimeToTravel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/not_available"
android:textColor="@color/white"
android:layout_column="1"
android:maxLines="4"/>
</TableRow>
<TableRow>
<TextView
android:id="@+id/textViewRatingLbl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/practice"
android:textColor="@color/white"
android:layout_column="0"
android:maxLines="4"/>
<TextView
android:id="@+id/textViewRating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/not_available"
android:textColor="@color/white"
android:layout_column="1"
android:maxLines="4"/>
</TableRow>
<TableRow>
<Button
android:id="@+id/buttonViewProfileVideo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/practice"
android:textColor="@color/colorPrimary"
android:layout_span="2"
android:background="@color/transparent" />
</TableRow>
<TableRow>
<Button
android:id="@+id/buttonViewMoreDetails"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/practice"
android:textColor="@color/colorPrimary"
android:layout_span="2"
android:background="@color/transparent" />
</TableRow>
<TableRow>
<Button
android:id="@+id/buttonApply"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
android:textSize="@dimen/small_text_size"
tools:text="@string/practice"
android:textColor="@color/bright_green"
android:layout_span="2"
android:background="@color/transparent"
android:clickable="true"/>
</TableRow>
</TableLayout>
</FrameLayout>
The coverflow is initialized here:
public class VacancyActivity extends AppCompatActivity {
private FeatureCoverFlow coverFlow;
private CoverFlowAdapter coverFlowAdapter;
private ArrayList<VacancyEntity> mData = new ArrayList<>(0);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_vacancy);
setup();
}
private void setup() {
mData.add(new VacancyEntity(
R.string.practice, "ABC Inc",
R.string.employment_type, "asldkjhf",
R.string.vacancy_type, "sdkfaslkdjf",
R.string.address, "asdfasdf",
R.string.rate_per_hour, "asdfasdf",
R.string.start_date, "asdkfdf",
R.string.end_date, "asdfasdf",
R.string.distance_to_travel, "sdkfjslkdjf",
R.string.time_to_travel, "asdfasdf",
R.string.rating, "asdlkfj",
R.string.view_practice_profile_video,
R.string.view_more_details,
R.string.apply));
coverFlowAdapter = new CoverFlowAdapter(this);
coverFlowAdapter.setData(mData);
coverFlow = (FeatureCoverFlow) findViewById(R.id.coverFlow);
coverFlow.setAdapter(coverFlowAdapter);
}
}
The custom adapter where the layout is inflated:
public class CoverFlowAdapter extends BaseAdapter {
private ArrayList<VacancyEntity> mData = new ArrayList<>(0);
private Context mContext;
public CoverFlowAdapter(Context context) {
mContext = context;
}
public void setData(ArrayList<VacancyEntity> data) {
mData = data;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int pos) {
return mData.get(pos);
}
@Override
public long getItemId(int pos) {
return pos;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = (LayoutInflater) mContext.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
rowView = inflater.inflate(R.layout.item_coverflow, parent, false);
ViewHolder viewHolder = new ViewHolder();
viewHolder.textViewPracticeNameLbl = (TextView)
rowView.findViewById(R.id.textViewPracticeNameLbl);
viewHolder.textViewPracticeName =
(TextView) rowView.findViewById(R.id.textViewPracticeName);
viewHolder.textViewEmploymentTypeLbl =
(TextView) rowView.findViewById(R.id.textViewEmploymentTypeLbl);
viewHolder.textViewEmploymentType =
(TextView) rowView.findViewById(R.id.textViewEmploymentType);
viewHolder.textViewVacancyTypeLbl =
(TextView) rowView.findViewById(R.id.textViewVacancyTypeLbl);
viewHolder.textViewVacancyType =
(TextView) rowView.findViewById(R.id.textViewVacancyType);
viewHolder.textViewAddressLbl =
(TextView) rowView.findViewById(R.id.textViewAddressLbl);
viewHolder.textViewAddress =
(TextView) rowView.findViewById(R.id.textViewAddress);
viewHolder.textViewRatePerHourLbl = (TextView) rowView.findViewById(R.id.textViewRatePerHourLbl);
viewHolder.textViewRatePerHour =
(TextView) rowView.findViewById(R.id.textViewRatePerHour);
viewHolder.textViewStartDateLbl =
(TextView) rowView.findViewById(R.id.textViewStartDateLbl);
viewHolder.textViewStartDate =
(TextView) rowView.findViewById(R.id.textViewStartDate);
viewHolder.textViewEndDateLbl =
(TextView) rowView.findViewById(R.id.textViewEndDateLbl);
viewHolder.textViewEndDate =
(TextView) rowView.findViewById(R.id.textViewEndDate);
viewHolder.textViewDistanceToTravelLbl =
(TextView) rowView.findViewById(R.id.textViewDistanceTravelLbl);
viewHolder.textViewDistanceToTravel =
(TextView) rowView.findViewById(R.id.textViewDistanceTravel);
viewHolder.textViewTimeToTravelLbl =
(TextView) rowView.findViewById(R.id.textViewTimeToTravelLbl);
viewHolder.textViewTimeToTravel =
(TextView) rowView.findViewById(R.id.textViewTimeToTravel);
viewHolder.textViewRatingLbl =
(TextView) rowView.findViewById(R.id.textViewRatingLbl);
viewHolder.textViewRating =
(TextView) rowView.findViewById(R.id.textViewRating);
viewHolder.buttonViewProfileVideo =
(Button) rowView.findViewById(R.id.buttonViewProfileVideo);
viewHolder.buttonViewMoreDetails =
(Button) rowView.findViewById(R.id.buttonViewMoreDetails);
viewHolder.buttonApply =
(Button) rowView.findViewById(R.id.buttonApply);
viewHolder.buttonApply.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "hello", Toast.LENGTH_SHORT).show();
}
});
rowView.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) rowView.getTag();
holder.textViewPracticeNameLbl.setText(mData.get(position).practiceLblId);
holder.textViewPracticeName.setText(mData.get(position).practiceData);
holder.textViewEmploymentTypeLbl.setText(mData.get(position).employmentTypeLblId);
holder.textViewEmploymentType.setText(mData.get(position).employmentTypeData);
holder.textViewVacancyTypeLbl.setText(mData.get(position).vacancyTypeLblId);
holder.textViewVacancyType.setText(mData.get(position).vacancyTypeData);
holder.textViewAddressLbl.setText(mData.get(position).addressLblId);
holder.textViewAddress.setText(mData.get(position).addressData);
holder.textViewRatePerHourLbl.setText(mData.get(position).ratePerHourLblId);
holder.textViewRatePerHour.setText(mData.get(position).ratePerHourData);
holder.textViewStartDateLbl.setText(mData.get(position).startDateLblId);
holder.textViewStartDate.setText(mData.get(position).startDateData);
holder.textViewEndDateLbl.setText(mData.get(position).endDateLblId);
holder.textViewEndDate.setText(mData.get(position).endDateData);
holder.textViewDistanceToTravelLbl.setText(mData.get(position).distanceToTravelLblId);
holder.textViewDistanceToTravel.setText(mData.get(position).distanceToTravelData);
holder.textViewTimeToTravelLbl.setText(mData.get(position).timeToTravelLblId);
holder.textViewTimeToTravel.setText(mData.get(position).timeToTravelData);
holder.textViewRatingLbl.setText(mData.get(position).ratingLblId);
holder.textViewRating.setText(mData.get(position).ratingData);
holder.buttonViewProfileVideo.setText(mData.get(position).viewPracticeProfileVideoLblId);
holder.buttonViewMoreDetails.setText(mData.get(position).viewMoreDetailsLblId);
holder.buttonApply.setText(mData.get(position).applyLblId);
return rowView;
}
private static class ViewHolder {
private TextView textViewPracticeNameLbl;
private TextView textViewPracticeName;
private TextView textViewEmploymentTypeLbl;
private TextView textViewEmploymentType;
private TextView textViewVacancyTypeLbl;
private TextView textViewVacancyType;
private TextView textViewAddressLbl;
private TextView textViewAddress;
private TextView textViewRatePerHourLbl;
private TextView textViewRatePerHour;
private TextView textViewStartDateLbl;
private TextView textViewStartDate;
private TextView textViewEndDateLbl;
private TextView textViewEndDate;
private TextView textViewDistanceToTravelLbl;
private TextView textViewDistanceToTravel;
private TextView textViewTimeToTravelLbl;
private TextView textViewTimeToTravel;
private TextView textViewRatingLbl;
private TextView textViewRating;
private Button buttonViewProfileVideo;
private Button buttonViewMoreDetails;
private Button buttonApply;
}
}
Ok, so continuing from the comments to the question:
I'm not really familiar with the library, so I'm gonna tell you what I suppose is happening and how I would try to overcome this issue:
The library is probably scaling the current page to the maxScaleFactor
(using scaleX
and scaleY
parameters). The consequence being the shift on the actual positions of Views
(including your click boxes) in contrary to their appearance on the screen.
I suggest you try to set maxScaleFactor
to 1.0f
and adjust other parameters to match your exact needs.