How to make ListView display correctly after clicking on onClickListener button?

UPDATE: I decided to use the ExpandableListAdapter to accomplish this ... since this code is almost effectively trying to design what the extensible listadapter is already doing.


I am using the standard ViewHolder template to make ListView just work ...


public View getView(int position, View convertView, ViewGroup parent) {
  View vi=convertView;
  ViewHolder holder;
  if( convertView == null ){
            vi = inflater.inflate(R.layout.item, null);
            holder=new ViewHolder();
            holder.text=(TextView)vi.findViewById(R.id.text);
            holder.image=(ImageView)vi.findViewById(R.id.image);
            holder.expandButton=(ImageView)vi.findViewById(R.id.expand_button);
            vi.setTag(holder);
        }
        else
            holder=(ViewHolder)vi.getTag();

However .... I believe that inside my onClickListener ... something is wrong.


 final String textData = texts[position];
 final ViewHolder holderFinal = holder;
 holder.expandButton.setVisibility(View.VISIBLE);
 holder.expandButton.setOnClickListener(new View.OnClickListener() 
   @Override
   public void onClick(View v) {
     holderFinal.expandButton.setImageResource(R.drawable.expander_ic_maximized);
     holderFinal.text.setText(textData);

So, when scrolling forward and backward everything is displayed perfectly. However, when one of the lists expands, the last line contains textual information belonging to the other line. How to get the correct text data for INSIDE in an onCLick listener?

+3
source share
4 answers

i , , listview , :

, ListView i, , :

static class DataHolder{
        Drawable extIcon;
        String text;
        String quantity_text;
        Drawable icon;
        int progressBarVisible;
        int quantityTextVisible;
    }

:

    ArrayList<DataHolder> data = new ArrayList<DataHolder>();
            for ( int i=0 ; i < activitys.length ; i++ ) {
                DataHolder item = new DataHolder();
    item.icon = icons[i];  //an icons array
                item.quantity_text = "";   //some text
                item.progressBarVisible = View.GONE;   //a status for a progress bar
//other data setting
    }

ArrayAdapter:

class ActivityList extends ArrayAdapter<DataHolder>{

        public ActivityList(Context context, int textViewResourceId, ArrayList<DataHolder> objects) {
            super(context, textViewResourceId, objects);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if(convertView == null){
                LayoutInflater inflater = LayoutInflater.from(HomeActivity.this);
                convertView = inflater.inflate(R.layout.home_activity_item, parent, false);
                holder = new ViewHolder();

                holder.text = (TextView)convertView.findViewById(R.id.homeActivityText);
                holder.icon = (ImageView)convertView.findViewById(R.id.homeActivityIcon);
                holder.progressBar = (ProgressBar)convertView.findViewById(R.id.homeActivityQuantityPBar);
                holder.quantity_text = (TextView)convertView.findViewById(R.id.homeActivityQuantity);
                holder.extIcon = (ImageView)convertView.findViewById(R.id.homeActivityIconExtended);

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

            holder.text.setText(getItem(position).text);
            holder.icon.setImageDrawable( getItem(position).icon );
            holder.quantity_text.setVisibility( getItem(position).quantityTextVisible );
            holder.quantity_text.setText( getItem(position).quantity_text );
            holder.progressBar.setVisibility( getItem(position).progressBarVisible  );
            holder.extIcon.setImageDrawable( getItem(position).extIcon );
            return convertView;
        }

    }

, , , . ( listView ActivityList) (SAVED_SEARCH - )

((ActivityList)listView.getAdapter()).getItem(SAVED_SEARCHED).progressBarVisible = View.GONE;
((ActivityList)listView.getAdapter()).getItem(SAVED_SEARCHED).quantity_text = "any text";
((ActivityList)listView.getAdapter()).notifyDataSetChanged();

, .

+2

postInvalidate() ViewHolder .

0
0
source

initialize int GlobalPostion as a global variable

GlobalPosition = position
holder.expandButton.setOnClickListener(new View.OnClickListener() int localPosition = GlobalPosition @Override public void onClick(View v) {
holderFinal.expandButton.setImageResource(R.drawable.expander_ic_maximized); holderFinal.text.setText(""+texts[localPosition]); }

The problem is that you do not get the exact position of the list, if you store it in a global variable, and then go to the local variable inside OnClick, you can save the position. Hope this helps you.

0
source

Source: https://habr.com/ru/post/1785080/


All Articles