0

I'm trying to generate custom component through a fragment. i followed as below. Now i am getting an error cause the interface method should implement in activity ( context passed is related to activity, not fragment) but i want to handle that method in the fragment. how can i do it? Didi do something wrong?

I am getting an error

MainActivity cannot be cast to EditTextComp$EditTextOnFocusListener

Fragment

public class CropDetailsFragment extends Fragment implements 
EditTextComp.EditTextOnFocusListener {

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    recyclerView = (RecyclerView) getView().findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);

    mLayoutManager = new LinearLayoutManager(getActivity());

    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());

    ArrayList<EditTextModel> tx = new ArrayList<EditTextModel>();

    EditTextModel cdm = new EditTextModel("", "No of Plants", null);


    tx.add(cdm);


    adapter = new EditTextCompAdapter(this.getContext(), tx);
    recyclerView.setAdapter(adapter);
}


@Override
public void onEditTextchange(String x) {
    String xx =x;
}

}

Adapter

public class EditTextCompAdapter extends 
RecyclerView.Adapter<EditTextCompAdapter.ViewHolder>  {

Context context;
ArrayList<EditTextModel> objects;


public EditTextCompAdapter(Context ctx, ArrayList<EditTextModel> objects) {

    context = ctx;
    this.objects = objects;
}



public class ViewHolder extends RecyclerView.ViewHolder {
    public String text;

    public ViewHolder(EditTextComp itemView) {
        super(itemView);
    }

    public void setText(EditTextModel editTextModel) {
        EditTextComp edittextView = (EditTextComp) itemView;

        edittextView.setdata(editTextModel);
        try {
            edittextView.setEditTextOnFocusListener( (EditTextComp.EditTextOnFocusListener) context);
        } catch (ClassCastException e) {
            e.printStackTrace();
            Log.e("TAG", e.toString());
        }
    }
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    EditTextComp customView = new EditTextComp(context);
    RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    customView.setLayoutParams(lp);
    return new ViewHolder(customView);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {

    EditTextModel edittext = objects.get(position);
    holder.setText(edittext);

}




@Override
public int getItemCount() {
    return objects.size();
}

}

Custom Component Class

public class EditTextComp extends LinearLayout implements 
View.OnFocusChangeListener {

EditText editText = null;

TextView textView = null;

public EditTextComp(Context context) {
    super(context, null);

    createComponent();
}

public interface EditTextOnFocusListener {
    void onEditTextchange(String value);
}

private EditTextOnFocusListener editTextonfocuslistener;

public void setEditTextOnFocusListener(EditTextOnFocusListener listener) {
    this.editTextonfocuslistener = listener;
}

@Override
public void onFocusChange(View v, boolean hasFocus) {
    if (!hasFocus) {
        EditText value = (EditText) v.findViewById(v.getId());
        String x = value.getText().toString();
        if (editTextonfocuslistener != null) {
            editTextonfocuslistener.onEditTextchange(x);
        }

    }
    switch (v.getId()) {
        case R.id.editText:

            break;
        default:
            break;
    }

}

public EditTextComp(Context context, AttributeSet attrs) {
    super(context, attrs, 0);
    createComponent();
}

public EditTextComp(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
createComponent();
}


private void createComponent() {

    inflate(getContext(), R.layout.compound_comp_edit_text, this);

    editText = (EditText) findViewById(R.id.editText);
    textView = (TextView) findViewById(R.id.text);


}

public void setdata(EditTextModel data) {
    editText.setText(data.getValue());
    editText.setHint(data.getPlaceholder());
    textView.setText((data.getTitle()!=null)? data.getTitle():"");

    editText.setOnFocusChangeListener(this);

}

}

Im new to android . please help me

Ramesh sambu
  • 3,577
  • 2
  • 24
  • 39
  • As the error says, you probably need to pass a context to the activity and then a listener. Try something to the effect of (MainActivity.this, listener or new EditTextOnFocusListener...) – namsnath Dec 29 '17 at 05:56
  • That's my question where i want to implement interface method in fragment not activity. ( if i created my interface method in activity problem solves i know it ) question is how to do it in a fragment. – Thilina Dinith Fonseka Dec 29 '17 at 06:08

1 Answers1

0

The code below returns activity context which doesn't implement EditTextOnFocusListener

edittextView.setEditTextOnFocusListener( (EditTextComp.EditTextOnFocusListener) context);

You should pass listener via constructor, like this:

public EditTextCompAdapter(Context ctx, ArrayList<EditTextModel> objects, EditTextComp.EditTextOnFocusListener listenter) {
        context = ctx;
        this.objects = objects;
        this.listener = listener;
    }

And see Simple Android RecyclerView example, you will find many intersting things )))

Anril
  • 66
  • 4