Search code examples
androidandroid-viewpager

Android button onclickListener not working on a fragment which has a viewPager


I have a simple fragment with a ViewPager to display text with a swipe.

I am trying to get OnClick event of a button in this layout shown below but I dont see anything happening, I am new to this and not sure if I am missing any.

Here is the fragment_proposal.xml

<android.support.v4.view.ViewPager
    android:id="@+id/proposalViewPager"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_below="@id/proposalHeader">                                        
</android.support.v4.view.ViewPager>

Here is the resource layout (proposal_swipe.xml) for this ViewPager which will display the text.

<Button
        android:id="@+id/proposalNotesBtn"
        android:layout_width="130dp"
        android:layout_height="50dp"
        android:layout_below="@id/notesText"
        android:text="Save Notes" />

<TextView
        android:id="@+id/enteredNotes"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_below="@id/proposalNotesBtn" />

Here is my Fragment Class where I try to capture the onclickevent

public class ProposalFragment extends Fragment implements View.OnClickListener {

ArrayList<ProposalDetailModel> listProposalDetail;
ViewPager viewPager;
ProposalSwipeAdapter proposalSwipeAdapter;
TextView tv, proposalHeader;
TextView sectionHeader;
Button proposalNotesBtn;
EditText notesText;
ProgressDialog progressDialog;

public ProposalFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View proposalDetailView = inflater.inflate(R.layout.fragment_proposal, container, false);
    proposalHeader = (TextView) proposalDetailView.findViewById(R.id.proposalHeader);
    proposalHeader.setTextColor(Color.WHITE);

    Bundle bundle = this.getArguments(); //getActivity().getIntent().getExtras();
    listProposalDetail = bundle.getParcelableArrayList("listDetails");

    View proposalView = inflater.inflate(R.layout.proposal_swipe, container, false);
    proposalNotesBtn = (Button) proposalView.findViewById(R.id.proposalNotesBtn);
    notesText = (EditText) proposalView.findViewById(R.id.notesText);

    proposalNotesBtn.setOnClickListener(new  View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.i("INSIDE CLICK", "INSIDE CLICK");
            new ProposalTask().execute();
        }
    });

    viewPager = (ViewPager) proposalDetailView.findViewById(R.id.proposalViewPager);
    viewPager.setAdapter(new ProposalSwipeAdapter(getContext(), listProposalDetail));
    return proposalDetailView;
}

I am sure I am missing something. I am returning the view of layout which has the viewpager. When I debugged, I see that proposalNotesBtn is returning an object but onclick of that, I dont see anything happening. Please any help here

here is my ProposalSwipeAdapter class

public class ProposalSwipeAdapter extends PagerAdapter {

private ArrayList<String> imageResourcess = new ArrayList<>();
private Context context;
private LayoutInflater inflater;

public ProposalSwipeAdapter(Context context, ArrayList<ProposalDetailModel> list) {
    this.context = context;
    //this.imageResourcess = list;
    for (ProposalDetailModel objectProposal : list
            ) {

        this.imageResourcess.add("\t\t\t\t\t\t\t\t\t\t                       PRODUCT/SERVICE \n\n\n\nSERVICE/PRODUCT OFFERED:" + objectProposal.getIntroWhoAreWe() +
                "\n\nTYPE OF CUSTOMERS:" + objectProposal.getAddres() +
                "\n\nWHY WILL THEY BUY IT:" +
                "\n\nPRODUCT PRICE:" +
                "\n\nCOMPETITORS:" +
                "\n\nSERVICE DELIVERY:");
    }

}

@Override
public int getItemPosition(Object object) {
    int index = imageResourcess.indexOf(object);
    if (index == -1)
        return POSITION_NONE;
    else
        return index;
}

@Override
public int getCount() {
    return imageResourcess.size();
    //return imageResources.length;
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == object;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = inflater.inflate(R.layout.proposal_swipe, null);
    //ImageView imageView = (ImageView) itemView.findViewById(R.id.proposalImage);
    //imageView.setImageResource(imageResources[position]);
    TextView tv = (TextView) itemView.findViewById(R.id.proposalText);
    tv.setText(imageResourcess.get(position).toString());
    //tv.setText(imageResources[position]);
    container.addView(itemView);
    Log.i("PROPOSAL VIEW-->", itemView.toString());
    return itemView;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    //container.removeView((LinearLayout) object);
    container.removeView((RelativeLayout) object);
}

Solution

  • you code for click listener should be in PagerAdapter instantiateItem()

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.proposal_swipe, null);
        //ImageView imageView = (ImageView) itemView.findViewById(R.id.proposalImage);
        //imageView.setImageResource(imageResources[position]);
        TextView tv = (TextView) itemView.findViewById(R.id.proposalText);
        tv.setText(imageResourcess.get(position).toString());
        //tv.setText(imageResources[position]);
    
        Log.i("PROPOSAL VIEW-->", itemView.toString());
        proposalNotesBtn = (Button) itemView.findViewById(R.id.proposalNotesBtn);
    
        proposalNotesBtn.setOnClickListener(new  View.OnClickListener() {
           @Override
           public void onClick(View view) {
              Log.i("INSIDE CLICK", "INSIDE CLICK");
           }
        });
        container.addView(itemView);
        return itemView;
    }