繁体   English   中英

将ViewHolder与ListView一起使用

[英]Using ViewHolder With ListView

我正在使用ListView来列出文本和图像,但是我想使用ViewHolder使滚动更加平滑,但是我不能完全正确地修改代码。

我尝试某些图像的方式未显示

@Override
public int getCount() {
    return text1.length;
}

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

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater infla=getActivity().getLayoutInflater();

    View v = infla.inflate(R.layout.list_view_layout, null);

    TextView tv1 = (TextView) v.findViewById(R.id.textView1);
    ImageView iv1 = (ImageView) v.findViewById(R.id.imageView1);
    TextView tv2 = (TextView) v.findViewById(R.id.textView2);
    ImageView iv2 = (ImageView) v.findViewById(R.id.imageView2);
    TextView tv3 = (TextView) v.findViewById(R.id.textView3);
    ImageView iv3 = (ImageView) v.findViewById(R.id.imageView3);
    TextView tv4 = (TextView) v.findViewById(R.id.textView4);
    ImageView iv4 = (ImageView) v.findViewById(R.id.imageView4);
    TextView tv5 = (TextView) v.findViewById(R.id.textView5);
    ImageView iv5 = (ImageView) v.findViewById(R.id.imageView5);
    TextView tv6 = (TextView) v.findViewById(R.id.textView6);
    ImageView iv6 = (ImageView) v.findViewById(R.id.imageView6);
    TextView tv7 = (TextView) v.findViewById(R.id.textView7);
    ImageView iv7 = (ImageView) v.findViewById(R.id.imageView7);

    tv1.setText(text1[position]);
    iv1.setImageResource(text2[position]);
    tv2.setText(text3[position]);
    iv2.setImageResource(text4[position]);
    tv3.setText(text5[position]);
    iv3.setImageResource(text6[position]);
    tv4.setText(text7[position]);
    iv4.setImageResource(text8[position]);
    tv5.setText(text9[position]);
    iv5.setImageResource(text10[position]);
    tv6.setText(text11[position]);
    iv6.setImageResource(text12[position]);
    tv7.setText(text13[position]);
    iv7.setImageResource(text14[position]);

    if(text2[position]==R.drawable.ic_star){
        iv1.setVisibility(View.GONE);
    }if(text3[position].matches("")) {
        tv2.setVisibility(View.GONE);
    }if(text4[position]==R.drawable.ic_star){
        iv2.setVisibility(View.GONE);
    }if(text5[position].matches("")) {
        tv3.setVisibility(View.GONE);
    }if(text6[position]==R.drawable.ic_star){
        iv3.setVisibility(View.GONE);
    }if(text7[position].matches("")){
        tv4.setVisibility(View.GONE);
    }if(text8[position]==R.drawable.ic_star){
        iv4.setVisibility(View.GONE);
    }if(text9[position].matches("")){
        tv5.setVisibility(View.GONE);
    }if(text10[position]==R.drawable.ic_star){
        iv5.setVisibility(View.GONE);
    }if(text11[position].matches("")){
        tv6.setVisibility(View.GONE);
    }if(text12[position]==R.drawable.ic_star){
        iv6.setVisibility(View.GONE);
    }if(text13[position].matches("")){
        tv7.setVisibility(View.GONE);
    }if(text14[position]==R.drawable.ic_star){
        iv7.setVisibility(View.GONE);
    }

    return v;
}

技巧:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if( convertView == null ){
    convertView = LayoutInflater.from(getActivity()).inflate(R.layout.list_view_layout, null);
    holder = new ViewHolder();
    holder.tv=(TextView) convertView.findViewById(R.id.textView);
    holder.iv=(ImageView) convertView.findViewById(R.id.imageView);
    ...
    convertView.setTag(holder);
}else {
    holder = (ViewHolder)convertView.getTag();
}

holder.tv.setText(text1[position]);
holder.iv.setImageResource(text2[position]);
...
//handle with your widgets cached in ViewHolder
return convertView;

}

ViewHolder在这里:

public class ViewHolder{
    TextView tv;
    ImageView iv;
}

首先,您需要一个静态ViewHolder类,该类将视图保存在适配器中。

更像这样一个:

static class ViewHolder {
public TextView text;
public ImageView image;
}

该视图持有者将用作视图的持有者,您可以在其中通过getView方法初始化其视图并将其设置为标签,以便稍后可以将其回收用于列表中的其他项目。

您可以点击此链接以应用listview的viewholder模式

您需要利用getView()方法中发送的convertView来优化工作。 通过适当地优化ListView阅读我的博客

Viewholder模式用于将列表项的Views缓存在holder类中,因此您不必为ListView中的每个列表项调用inflate view或findViewById() 通过制作一个您可以容纳的类,在列表项中保留对所有ChildView的引用。 通常这是一个内部静态类。

getView()方法中的View convertView,参数是已经由Android系统缓存的视图。 因此,从if语句开始,如果convertView为null,则在该语句中为列表项充气。 您还可以在该视图持有器上设置所有子视图引用。 然后,使用setTag()将viewholder类的实例作为标签添加到convertView 在if语句的else部分中,您只需要通过带有getTag()convertView中的getTag() 不,您拥有viewHolder,并且实际上可以使用新数据更新listview项。

我希望这能解释您的需要,如果没有,这里是一些链接,可以链接到比我更好的解释。

-这是mmodified适配器,可使用查看器模式重复使用该项,而不是每次滚动都创建新项,从而使滚动更加平滑。

/**
 * Created by Ziad on 4/22/2015.
 */
public class Adapter extends BaseAdapter {


    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return text1.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return text1[position];
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub




        ViewdHolder holder=null;

        if (convertView == null) {

            LayoutInflater infla=getActivity().getLayoutInflater();


            View v = infla.inflate(R.layout.list_view_layout, null);

            holder = new viewdHolder();

            holder.tv1= (TextView) v.findViewById(R.id.textView1);
            holder.iv1 = (ImageView) v.findViewById(R.id.imageView1);
            holder.tv2 =(TextView)  v.findViewById(R.id.textView2);
            holder.iv2= (ImageView) v.findViewById(R.id.imageView2);
            holder.tv3 = (TextView) v.findViewById(R.id.textView3);
            holder.iv3 = (ImageView) v.findViewById(R.id.imageView3);
            holder.tv4 = (TextView) v.findViewById(R.id.textView4);
            holder.iv4  = (ImageView) v.findViewById(R.id.imageView4);
            holder.tv5= (TextView) v.findViewById(R.id.textView5);
            holder.iv5  = (ImageView) v.findViewById(R.id.imageView5);
            holder.tv6 = (TextView) v.findViewById(R.id.textView6);
            holder.iv6 = (ImageView) v.findViewById(R.id.imageView6);
            holder.tv7 = (TextView) v.findViewById(R.id.textView7);
            holder.iv7 = (ImageView) v.findViewById(R.id.imageView7);

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

        }




        holder.tv1.setText(text1[position]);
        holder.iv1.setImageResource(text2[position]);
        holder.tv2.setText(text3[position]);
        holder.iv2.setImageResource(text4[position]);
        holder.tv3.setText(text5[position]);
        holder.iv3.setImageResource(text6[position]);
        holder.tv4.setText(text7[position]);
        holder.iv4.setImageResource(text8[position]);
        holder.tv5.setText(text9[position]);
        holder.iv5.setImageResource(text10[position]);
        holder.tv6.setText(text11[position]);
        holder.iv6.setImageResource(text12[position]);
        holder.tv7.setText(text13[position]);
        holder.iv7.setImageResource(text14[position]);



        if(text2[position]==R.drawable.ic_star){
            holder.iv1.setVisibility(View.GONE);
        }
        if(text3[position].matches("")) {
            holder.tv2.setVisibility(View.GONE);
        }
        if(text4[position]==R.drawable.ic_star){
            holder.iv2.setVisibility(View.GONE);
        }
        if(text5[position].matches("")) {
            holder.tv3.setVisibility(View.GONE);
        }
        if(text6[position]==R.drawable.ic_star){
            holder.iv3.setVisibility(View.GONE);
        }
        if(text7[position].matches("")){
            holder.tv4.setVisibility(View.GONE);
        }
        if(text8[position]==R.drawable.ic_star){
            holder.iv4.setVisibility(View.GONE);
        }
        if(text9[position].matches("")){
            holder.tv5.setVisibility(View.GONE);
        }
        if(text10[position]==R.drawable.ic_star){
            holder.iv5.setVisibility(View.GONE);
        }
        if(text11[position].matches("")){
            holder.tv6.setVisibility(View.GONE);
        }
        if(text12[position]==R.drawable.ic_star){
            holder.iv6.setVisibility(View.GONE);
        }
        if(text13[position].matches("")){
            holder.tv7.setVisibility(View.GONE);
        }
        if(text14[position]==R.drawable.ic_star){
            holder.iv7.setVisibility(View.GONE);
        }




        return v;
    }


    class ViewdHolder {




        TextView tv1;
        ImageView iv1 ;
        TextView tv2 ;
        ImageView iv2;
        TextView tv3 ;
        ImageView iv3 ;
        TextView tv4 ;
        ImageView iv4 ;
        TextView tv5 ;
        ImageView iv5 ;
        TextView tv6 ;
        ImageView iv6 ;
        TextView tv7 ;
        ImageView iv7 ;


    }



}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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