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

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

您可以按照此链接应用listview 的viewholder模式

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

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

getView()方法中的View convertView,参数是Android系统已经缓存的视图。因此,从if语句开始,如果convertView为null,则对列表项进行膨胀。您还可以在那里的viewholder上设置所有子视图引用。然后将viewholder类的实例作为标记添加到具有setTag()convertView中。在if语句的另一部分中,您只需从convertViewgetTag()中获取viewholder。不,你有viewHolder,实际上可以用新数据更新列表视图项。

我希望这能解释你需要做什么,如果没有,这里有一些更好的资源链接,那就是我的解释。

  • Vogela
  • 在视图固定器中固定视图对象
  • Android ViewHolder模式示例

这里是一个经过mmodified的适配器,它使用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 ;

}

}

最新更新