简体   繁体   中英

making ViewHolder final in Custom Listview Adapter android

I have a listView with custom adapter like this

@Override
public View getView(int position, View convertView, ViewGroup parent) 
{       
    View view = convertView;
    ViewHolder viewHolder = new ViewHolder();

    if (convertView == null)
    {
        view = inflator.inflate(R.layout.question_adapter_layout, parent, false);
        viewHolder.moreLayout = (LinearLayout) view.findViewById(R.id.extraOptions);

        viewHolder.reportBtn   = (Button) view.findViewById(R.id.more_report);
        viewHolder.twitterBtn  = (Button) view.findViewById(R.id.more_twitter);
        viewHolder.googleBtn   = (Button) view.findViewById(R.id.more_google);
        viewHolder.fbBtn       = (Button) view.findViewById(R.id.more_fb);
        viewHolder.deleteBtn   = (Button) view.findViewById(R.id.more_delete);

        view.setTag(viewHolder);
    }
    else
        viewHolder = (ViewHolder) view.getTag();

    viewHolder.moreBtn.setOnClickListener(new View.OnClickListener() 
    {
        @Override
        public void onClick(View v) 
        {
            Utilities.vibrate(mContext);
            if (viewHolder.moreLayout.getVisibility() == View.GONE)
                viewHolder.moreLayout.setVisibility(View.VISIBLE);
            else
                viewHolder.moreLayout.setVisibility(View.GONE);
        }
    });

Now changing anything in onClickListener ie viewHolder.moreLayout.setVisibility(View.GONE); I need to make viewHolder final but then i won't be able to do viewHolder = (ViewHolder) view.getTag();

How can i fix this issue?

Assign it to a final field before the setOnClickListener

final ViewHolder viewHolderFinal = viewHolder;
viewHolder.moreBtn.setOnClickListener(new View.OnClickListener()

and use viewHolderFinal inside onClickListener

you can avoid to create a new ViewHolder everytime getView is invoked.

ViewHolder viewHolder = null;

    if (convertView == null)
    {
      viewHolder = new ViewHolder();

Put onClickListener inside in ViewHolder and the view moreLayout also put in ViewHolder

    class ViewHolder {

    public View more_Layout;

    public Button reportBtn;
    public Button twitterBtn;
    public Button googleBtn;
    public Button fbBtn;
    public Button deleteBtn;


    public ViewHolder(){

    moreBtn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) 
      {
        Utilities.vibrate(mContext);
        if (moreLayout.getVisibility() == View.GONE)
            moreLayout.setVisibility(View.VISIBLE);
        else
            moreLayout.setVisibility(View.GONE);
      }
    });

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM