0

I have a custom list view with base adapter.In the listview each item contain button and a textview,I want to visible the textview when clicking on the corresponding button.It is working bt my problem is that when i click on the button the textview is visible in more than one item.Please suggest any solution.

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        // convertView = new View(context);
        convertView = inflater.inflate(R.layout.secondadapter, null);
    }

holder.ans=(Button)convertView.findViewById(R.id.btn_ans);
holder.textview=(TextView)convertView.findViewById(R.id.txt_ans);

holder.ans.setOnClickListener(new OnClickListener() {
   @Override
    public void onClick(View v) {

holder.textview.setText("Answer is correct");

}
});

}
public class Holder
{
TextView textview;
Button ans;
}

6 Answers6

3

Try this code.

    @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            if (convertView == null) {
    // convertView = new View(context);
    convertView = inflater.inflate(R.layout.secondadapter, null);
    holder.ans=(Button)convertView.findViewById(R.id.btn_ans);
    holder.textview=(TextView)convertView.findViewById(R.id.txt_ans);
    convertView.setTag(holder);

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

      if(!isTextViewVisible[position]) {  holder.textview.setVisibility(View.Invisible); }
else {
holder.textview.setVisibility(View.visible); 
}
holder.ans.setOnClickListener(new OnClickListener() { 
@Override 
public void onClick(View v) 
{ 
holder.textview.setText("Answer is correct");    isTextViewVisible[position] = true; 
} });

    }
    public class Holder
    {
    TextView textview;
    Button ans;
    }
Shaheera
  • 307
  • 1
  • 15
  • Its working but when i scroll the listview to bottom the textview in the first listitems is to be invisible.please help – Krishnapriya M R Sep 18 '15 at 08:39
  • 1
    It is happening because getView is called for every row when you scroll back to the first row getView is called and sets the visibility for all textviews "Invisible". To avoid this you will have to keep the status of textviews in an array or ArrayList which is convinient for you. Like Boolean[] isTextViewVisible = new Boolean[no of rows]; Add False for every row. Change the status when you click on the button. – Shaheera Sep 18 '15 at 10:00
  • Thnku so much infiniteVisio for ur support.Its working – Krishnapriya M R Sep 19 '15 at 04:11
  • I am glad I have solved your problem :). Kindly, upvote my answer so that it may help others as well. – Shaheera Sep 20 '15 at 15:42
0

You are didn't follow ViewHolder Pattern.You have to use convertView.setTag(holder) and holder=(holder)convertView.getTag()

@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
    // convertView = new View(context);
    convertView = inflater.inflate(R.layout.secondadapter, null);
    holder.ans=(Button)convertView.findViewById(R.id.btn_ans);
    holder.textview=(TextView)convertView.findViewById(R.id.txt_ans);
    convertView.setTag(holder);

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



holder.ans.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {

holder.textview.setText("Answer is correct");

}
});

}
public class Holder
{
   TextView textview;
   Button ans;
}
Kishore Jethava
  • 6,666
  • 5
  • 35
  • 51
0

Please have a read to understand , how listview works.

public class SampleAdapter extends BaseAdapter {

    public SampleAdapter (Activity callingActivity,
            ArrayList datas, Resources imagesEtc) {
        this.callingActivity = callingActivity;
        this.datas = datas;
        this.imagesEtc = imagesEtc;
    }

    @Override
    public void notifyDataSetChanged() {
        // Refresh List rows
        super.notifyDataSetChanged();

    }

    @Override
    public int getCount() {
        if (datas.size() <= 0)
            return 1;
        return datas.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public static class ItemsInEachRow {
        TextView sample1, sample2, sample3;

    }

    @Override
    public View getView(final int position, View eachRowsView,
            ViewGroup parentView) {
        // To Inflate Single Item of ListView

        View eachRow = eachRowsView;
        ItemsInEachRow itemsInEachRow;
        if (eachRowsView == null) {
            itemsInEachRow = new ItemsInEachRow();

            eachRow = callingActivity.getLayoutInflater().inflate(
                    R.layout.your_layout, null);

            itemsInEachRow.sample1= (TextView) eachRow
                    .findViewById(R.id.sample1);

        eachRow.setTag(itemsInEachRow);

    } else {
        itemsInEachRow = (ItemsInEachRow) eachRow.getTag();
    }

        itemsInEachRow.sample1
                .setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View arg0) {

                    }
                });

        return eachRow;
    }


}
Community
  • 1
  • 1
Don Chakkappan
  • 7,397
  • 5
  • 44
  • 59
0

Please see below code hope it will work for you

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) 
    {

        convertView = inflater.inflate(R.layout.secondadapter, null);

        holder.ans=(Button)convertView.findViewById(R.id.btn_ans);
        holder.textview=(TextView)convertView.findViewById(R.id.txt_ans);
        convertView.setTag(holder);
    }
     else
    {
        m_viewHolder = (ViewHolder) convertView.getTag();
    }

holder.ans.setTag(position);

holder.ans.setOnClickListener(new OnClickListener()
{
   @Override
    public void onClick(View v)
    {
        int m_position = Integer.parseInt(p_view.getTag().toString());
        holder.textview.setText("Answer is correct");
    }
});

}
public class Holder
{
TextView textview;
Button ans;
}
0

If textview is sibling of button. Using its parent get the corresponding textview. here is the code.

holder.ans.setOnClickListener(new OnClickListener()
{
   @Override
    public void onClick(View v)
    {
       View vi = (View) v.getParent();
       TextView texview = (TextView) vi.findViewById(R.id.txt_ans);
       textview.setText("Answer is correct");
       textview.setVisiblity(View.VISIBLE);
    }
});
arun
  • 1,728
  • 15
  • 15
0
  1. There are more than one view getting visible is because ListView reuse your view if it is no longer visible on the screen. To tell ListView to don't do this for a view: itemView.setHasTransientState(true) When you are done with that view (e.g the item has been removed) you can call the method again and set it to false. To Learn more. https://www.youtube.com/watch?v=8MIfSxgsHIs

P/s: It seems like you do not follow the viewHolder Pattern as @kishore-jethava said.

Tin Tran
  • 2,265
  • 1
  • 14
  • 17