1

I am using a listview in my Android program.

I have row. 1) i have custom row in button and i want to when click button then open the alert box and this row clicked then open the new activity but Only one button clicked not row clicked . how to possible in this case. my code in below.

Thank you.

public class AlMessagesAdapter extends ArrayAdapter<DtoAllMessages> {

    private LayoutInflater inflator;
    private ArrayList<DtoAllMessages> userlist;

    public AlMessagesAdapter(Activity context, ArrayList<DtoAllMessages> list) {
        super(context, R.layout.custom_list, list);

        this.userlist = list;
        inflator = context.getLayoutInflater();
    }

  @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        ViewHolder holder = null;
        if (convertView == null) {
            convertView = inflator.inflate(R.layout.custom_list, null);
            holder = new ViewHolder();
            holder.title = (TextView) convertView.findViewById(R.id.tvName);
            holder.date_cr = (TextView) convertView.findViewById(R.id.tvDate);
            holder.img = (ImageView)convertView.findViewById(R.id.ivIcon);
            holder.tokenBtn = (Button)convertView.findViewById(R.id.tokenBtn);
            convertView.setTag(holder);
            convertView.setTag(R.id.tvName, holder.title);
            convertView.setTag(R.id.tvDate, holder.date_cr);
            convertView.setTag(R.id.ivIcon,holder.img);
            convertView.setTag(R.id.tokenBtn,holder.tokenBtn);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        String token = userlist.get(position).getToken();

        Log.v("MessageList", "token:" + token);

        token = token.substring(0,token.length()-3);

        holder.title.setText(userlist.get(position).getName()+"("+token+")");

        String type_data =  userlist.get(position).getType().toString();

        if((type_data.equals("text")) || (type_data.equals("photo")))
        {
            Log.v("log", "  if  text photo ");
            holder.date_cr.setText(userlist.get(position).getType()+":Received "+userlist.get(position).getCreated_date());
            holder.tokenBtn.setVisibility(View.VISIBLE);
            list.setItemsCanFocus(true);
        }
        else if(type_data.equals("out"))
        {
            Log.v("log", " else out ");
            holder.date_cr.setText(userlist.get(position).getType()+":Sent "+userlist.get(position).getCreated_date());
            holder.tokenBtn.setVisibility(View.GONE);
        }

        if(type_data.equals("text"))
        {
            Log.v("log", " if text ");
            holder.img.setBackgroundResource(R.drawable.chatmessage);

        }
        else if(type_data.equals("photo"))
        {
            Log.v("log", " ese if photo ");
            holder.img.setBackgroundResource(R.drawable.photomessage);

        }
        else if(type_data.equals("out"))
        {
            Log.v("log", " ese if out ");
            holder.img.setBackgroundResource(R.drawable.outmessafe);
        }


        if(position%2==0)
        {
            convertView.setBackgroundResource(R.drawable.whitebackground);
        }
        else
        {
            convertView.setBackgroundResource(R.drawable.greybackground);
        }

        holder.tokenBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Log.v("log_tag"," token button clicked");
            }
        });


        return convertView;
    }

     class ViewHolder {
        protected ImageView img;
        protected TextView date_cr;
        protected TextView title;
        protected Button tokenBtn;
    }
} 

and list click event in below::

 list.setOnItemLongClickListener(new OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int position, long arg3) {
                // TODO Auto-generated method stub

                 msg = userLIstArray.get(position).getMessage();
                  token = userLIstArray.get(position).getToken();
                  type = userLIstArray.get(position).getType();
                  int msgId = userLIstArray.get(position).getMessageid();
                  token = token.substring(0,token.length()-3);
                  int token_value = Integer.parseInt(token) * 1000;   

                if(type.equals("text"))
                {
                    Log.v("log",  " if in text to Display " + msg + " token "+token);
                   Intent i = new Intent(MessagesList.this,DisplayPopupActivity.class);
                   i.putExtra("msg", msg);
                   i.putExtra("token", token);
                   i.putExtra("msgid", msgId);
                   startActivity(i);

                }
                else if(type.equals("photo"))
                {
                    Log.v("log",  " else in IMage to Display " + msg + " token "+token);

                     Log.v("log","token "+token+" type "+type + " position  "+position + "msgId "+ msgId);

                    Intent i = new Intent(MessagesList.this,DisplayImageActivity.class);
                       i.putExtra("imgData", msg);
                       i.putExtra("token", token);
                       i.putExtra("msgid", msgId);
                       startActivity(i);

               //Log.v("log"," Message" +message);
               //Toast.makeText(AllMessageActivity.this, "Message "+message, Toast.LENGTH_LONG).show();
                }

                return false;
            }
         });
    }

5 Answers 5

3

Try this,

Instead of button use TextView. and the write onclickListerner to TextView. i had face same issue in ListView Button click using textview now its working fine. just try it.

Sign up to request clarification or add additional context in comments.

Comments

2

You can add the row click event using:

listView.setOnItemClickListener(new OnItemClickListener() {
  @Override
  public void onItemClick(final AdapterView<?> parent, final View view, final int position, long id) {
          //go to new activity
  }); 

And the button event, as you are doing..

holder.tokenBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Log.v("log_tag"," token button clicked");
            //show alert
        }
    });

6 Comments

thanks for the reply but i cliked row not working and i edit in my question in listview click event please check it.
you are setting setOnItemLongClickListener not setOnItemClickListener, what you want exactly?
I list's row contanst cliked then new activity call.
if you want long press then use setOnItemLongClickListener but if you want just click you should use setOnItemClickListener instead
right but not click ling press in this row but button cliked very well how to problem solve this issue.
|
1

call your clickevent inside if condition

if (convertView == null) {
            convertView = inflator.inflate(R.layout.custom_list, null);
            holder = new ViewHolder();
            holder.title = (TextView) convertView.findViewById(R.id.tvName);
            holder.date_cr = (TextView) convertView.findViewById(R.id.tvDate);
            holder.img = (ImageView)convertView.findViewById(R.id.ivIcon);
            holder.tokenBtn = (Button)convertView.findViewById(R.id.tokenBtn);
           holder.tokenBtn.setOnClickListener(click);

        }

create clicklistner outside.

private OnClickListener click = new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        // do your stuff here
    }
};

Comments

1

In your Adapter class set an OnclickListner

private LayoutInflater inflator;
private ArrayList<DtoAllMessages> userlist;
private Context context; //added

public AlMessagesAdapter(Activity context, ArrayList<DtoAllMessages> list) {
    super(context, R.layout.custom_list, list);
    this.context=context; //added
    this.userlist = list;
    inflator = context.getLayoutInflater();
}

     @Override
     public View getView(final int position, View convertView, ViewGroup parent) {

    ViewHolder holder = null;
    if (convertView == null) {
        convertView = inflator.inflate(R.layout.custom_list, null);
        holder = new ViewHolder();
        holder.title = (TextView) convertView.findViewById(R.id.tvName);
        holder.date_cr = (TextView) convertView.findViewById(R.id.tvDate);
        holder.img = (ImageView)convertView.findViewById(R.id.ivIcon);
        holder.tokenBtn = (Button)convertView.findViewById(R.id.tokenBtn);

        holder.tokenBtn.setOnClickListener((OnClickListener)context); //added portion

        convertView.setTag(holder);
        convertView.setTag(R.id.tvName, holder.title);
        convertView.setTag(R.id.tvDate, holder.date_cr);
        convertView.setTag(R.id.ivIcon,holder.img);
        convertView.setTag(R.id.tokenBtn,holder.tokenBtn);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    String token = userlist.get(position).getToken();

    Log.v("MessageList", "token:" + token);

    token = token.substring(0,token.length()-3);

    holder.title.setText(userlist.get(position).getName()+"("+token+")");

    String type_data =  userlist.get(position).getType().toString();

    if((type_data.equals("text")) || (type_data.equals("photo")))
    {
        Log.v("log", "  if  text photo ");
        holder.date_cr.setText(userlist.get(position).getType()+":Received "+userlist.get(position).getCreated_date());
        holder.tokenBtn.setVisibility(View.VISIBLE);
        list.setItemsCanFocus(true);
    }
    else if(type_data.equals("out"))
    {
        Log.v("log", " else out ");
        holder.date_cr.setText(userlist.get(position).getType()+":Sent "+userlist.get(position).getCreated_date());
        holder.tokenBtn.setVisibility(View.GONE);
    }

    if(type_data.equals("text"))
    {
        Log.v("log", " if text ");
        holder.img.setBackgroundResource(R.drawable.chatmessage);

    }
    else if(type_data.equals("photo"))
    {
        Log.v("log", " ese if photo ");
        holder.img.setBackgroundResource(R.drawable.photomessage);

    }
    else if(type_data.equals("out"))
    {
        Log.v("log", " ese if out ");
        holder.img.setBackgroundResource(R.drawable.outmessafe);
    }


    if(position%2==0)
    {
        convertView.setBackgroundResource(R.drawable.whitebackground);
    }
    else
    {
        convertView.setBackgroundResource(R.drawable.greybackground);
    }

    /*holder.tokenBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Log.v("log_tag"," token button clicked");
        }
    });*/


    return convertView;
}

 class ViewHolder {
    protected ImageView img;
    protected TextView date_cr;
    protected TextView title;
    protected Button tokenBtn;
}
} 

And into your Main class

public Main extends Activity implements OnClickListener{

     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.casual_layout);

         Button tokenBtn=(Button)findViewById(R.id.tokenBtn);
                tokenBtn.setOnClickListener(this);
         }
       public void onClick(View v) {
    switch (v.getId()) {
                  case R.id.tokenBtn:
                    //Write a code here to execute alertdialog
                    Log.d("ALERT HERE","ALERT HERE"); 
                  break;
             }
}

Comments

0

If you want to use a Button instead of a TextView set

   android:focusable="false"

to your Button

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.