0

I have issue on single click Button in Adapter RecyclerView. The click button always more click to get response. But I want to single click, then get respon..

this is my button.

<Button
        android:id="@+id/btn_action"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableTop="@drawable/ic_add_white_24dp"
        android:theme="@style/Button.Blue" />

and this is my adapter

public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.ViewHolder> implements View.OnClickListener {

    .............

    private OnNewsItemClickListener OnNewsItemClickListener;

    public void setOnNewsItemClickListener(OnNewsItemClickListener onNewsItemClickListener) {
        this.OnNewsItemClickListener = onNewsItemClickListener;
    }

    public interface OnNewsItemClickListener {
        public void onActionClick(View v, int position);

    }

    public NewsAdapter(Activity activity, ArrayList<HashMap<String, String>> News,
                       ArrayList<HashMap<String, String[]>> newsArticleImages) {
        this.activity = activity;
        dataNews = News;


    }


    @Override
    public void onClick(View v) {

        final int viewId = v.getId();
        if (viewId == R.id.btn_action) {
            if (OnNewsItemClickListener != null) {
                OnNewsItemClickListener.onActionClick(v, (Integer) v.getTag());
            }
        }
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        @Bind(R.id.btn_action)
        Button btn_action;

        public ViewHolder(View vi) {
            super(vi);
            ButterKnife.bind(this, vi);

        }

    }

    @Override
    public NewsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                     int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.pin_item_news_recyclerview, parent, false);
        ViewHolder holder = new ViewHolder(v);
        holder.btn_action.setOnClickListener(this);
        return holder;
    }

    public void onBindViewHolder(final ViewHolder holder, int position) {



    }
.............
}

this my Activity to call ClickListener

public class BusinessActivity extends AppCompatActivity implements OnRefreshListener, NewsAdapter.OnNewsItemClickListener {


        @Bind(R.id.grid_view) RecyclerView list;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.business_home);
            ButterKnife.bind(this);

            adapter = new NewsAdapter(BusinessActivity.this, NewsList,
                    NewsArticleImagesList);
            adapter.setOnNewsItemClickListener(this);
            list.setHasFixedSize(true);

            list.setAdapter(adapter);

        }



    @Override
    public void onActionClick(View v, int position) {

        HashMap<String, String> news = new HashMap<String, String>();
        news= adapter.dataNews.get(position);
        String btn_des = news.get(Variabel.KEY_BTN_DES);
        if(btn_des.equals("Add News")) {
            Bundle b = new Bundle();
            Intent i;
            i = new Intent(BusinessActivity.this, AddNewsActivity.class);
            b.putString(Variabel.KEY_BUSINESS_NAME, business_name);
            b.putString(Variabel.KEY_INFO_FULL, info_full);
            b.putString(Variabel.KEY_SUB_INFO_FULL, sub_info_full);
            b.putString(Variabel.KEY_ID_BUSINESS, _idBusiness);
            i.putExtras(b);
            startActivity(i);
        }
    }
    }

so how to fix it ?

Amay Diam
  • 2,561
  • 7
  • 33
  • 57

1 Answers1

0

If it is responding to the click events, I guess its working properly. It may be just taking time. Try clicking only once and wait for some time. If it is responding then its working fine. And it may be a performance issue. Post your code so that we can get better idea about what is actually happening.

Try using the below adapter, and make any changes if required. Your "ViewHolder" class should implement View.OnClickListener not the adapter itself.

//package 

import android.app.Activity;
import android.content.Context;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;

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

    private ArrayList<HashMap<String, String>> dataNews;
    private Context context;

    public NewsAdapter(Activity activity, ArrayList<HashMap<String, String>> News,
                       ArrayList<HashMap<String, String[]>> newsArticleImages) {
        this.context = activity;
        dataNews = News;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v;
        ViewHolder vhItem;
        v = LayoutInflater.from(parent.getContext()).inflate(R.layout.pin_item_news_recyclerview, parent, false);
        vhItem = new ViewHolder(v, viewType, context);
        return vhItem;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
//        holder.btn_action.setText("Action");
    }

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

    @Override
    public int getItemViewType(int position) {
        return 0;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        int Holderid;

        private OnNewsItemClickListener OnNewsItemClickListener;
        Button  btn_action;;
        Context contxt;


        public ViewHolder(View itemView, int ViewType, Context c) {
            super(itemView);
            contxt = c;
            itemView.setClickable(true);
            itemView.setOnClickListener(this);

            btn_action = (Button) itemView.findViewById(R.id.btnDeleteGoalRecyclerItemActGoalList);

            btn_action.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            try {
                OnNewsItemClickListener = (OnNewsItemClickListener) contxt;
            } catch (ClassCastException e) {
                throw new ClassCastException(contxt.toString()
                        + " must implement OnNewsItemClickListener");
            }
            final int viewId = v.getId();
            if (viewId == R.id.btn_action) {
                if (OnNewsItemClickListener != null) {
                    OnNewsItemClickListener.onActionClick(v, (Integer) v.getTag());
                }
            }
        }
    }

    public interface OnNewsItemClickListener {
        public void onActionClick(View v, int position);
    }
}
Rohit Jagtap
  • 1,660
  • 1
  • 14
  • 12
  • where i must put `public void setOnNewsItemClickListener(OnNewsItemClickListener onNewsItemClickListener) { this.OnNewsItemClickListener = onNewsItemClickListener; }` in adapter and how to call in Activity sir, i get error in line `adapter.setOnNewsItemClickListener(this);` ? – Amay Diam Aug 27 '15 at 22:26
  • I believe there's no need to put these lines, try removing them as we have set the onClickListener to the button in the ViewHolder class – Rohit Jagtap Aug 28 '15 at 07:14