【问题标题】:Using ViewHolder With ListView将 ViewHolder 与 ListView 一起使用
【发布时间】:2015-04-22 08:18:44
【问题描述】:

我正在使用 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 模式以获得更好的性能,

标签: java android listview android-viewholder


【解决方案1】:

技巧:

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

【讨论】:

    【解决方案2】:

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

    更喜欢这个:

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

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

    你可以关注this link来应用listview的viewholder模式

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        Viewholder 模式用于在持有者类中缓存列表项的视图,因此您不必为ListView 中的每个列表项调用膨胀视图或findViewById()。通过创建一个可以保存对列表项中所有 ChildViews 的引用的类。通常这是一个内部静态类。

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

        我希望这能解释你需要什么

        【讨论】:

          【解决方案5】:

          -这里是修改后的适配器,使用 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 ;
          
          
              }
          
          
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-31
            • 1970-01-01
            • 2015-04-16
            • 2015-11-14
            • 1970-01-01
            • 2019-07-16
            • 2014-05-31
            相关资源
            最近更新 更多