将 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;
}

首先,您需要一个静态 ViewHolder Class 来保存您在适配器中的视图。

更像这个:

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

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

您可以按照this link应用listview的viewholder模式

您需要使用 getView() 中发送的 convertView 方法来优化工作。 阅读我的 blog 正确优化 ListView。

Viewholder 模式用于在容器中缓存列表项的视图 class 因此您不必为 [=] 中的每个列表项调用 inflate view 或 findViewById() 11=]。通过创建一个 class 可以保留对列表项中所有 ChildViews 的引用。通常这是内部静态 class.

getView()方法中的View convertView,参数是Android系统已经缓存的视图。因此,您从 if 语句开始,如果 convertView 为 null,则在其中扩充列表项。您还在那里的查看器上设置了所有子视图引用。然后,您将 viewholder class 的实例作为标记添加到带有 setTag()convertView 中。在 if 语句的 else 部分,您只需使用 getTag()convertView 获取视图持有者。不,您有 viewHolder,实际上可以用新数据更新列表视图项。

我希望这能解释你需要什么,如果没有的话,这里有一些指向更好资源的链接,然后是我的解释。

-这里是修改后的适配器,使用 viewholder 模式重用项目而不是每次滚动时都创建一个新项目,使滚动更加流畅。

/**
 * 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 ;


    }



}

技巧:

@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;
}