2015-06-24 65 views
0

我想在ListView中显示一些单词。但问题是当我开始滚动ListView未填充下一个单词时,它随机填充相同的重复单词。滚动android的ListView项显示错误?

DictListAdapter:

public class DictListViewAdapter extends BaseSwipeAdapter { 

    private Context mContext; 
    private ArrayList<String> searchResult; 
    private String word; 
    private LayoutInflater inflater; 
    TextView wrd; 

    public DictListViewAdapter(Context mContext, ArrayList<String>searchResult) { 
     this.mContext = mContext; 
     this.searchResult = searchResult; 
    } 

    @Override 
    public int getSwipeLayoutResourceId(int position) { 
     return R.id.swipe; 
    } 

    @Override 
    public View generateView(final int position, ViewGroup parent,View v) { 
      if(inflater==null){ 
       inflater = (LayoutInflater) mContext 
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      } 
      if(v==null) { 
       v = inflater.inflate(R.layout.listview_item,null); 
      } 


     wrd = (TextView) v.findViewById(R.id.word); 
     final TextView meaning=(TextView)v.findViewById(R.id.meaning); 

     SwipeLayout swipeLayout = (SwipeLayout)v.findViewById(getSwipeLayoutResourceId(position)); 
     swipeLayout.addSwipeListener(new SimpleSwipeListener() { 
      @Override 
      public void onOpen(SwipeLayout layout) { 
       // YoYo.with(Techniques.Tada).duration(500).delay(100).playOn(layout.findViewById(R.id.trash)); 
       //Toast.makeText(mContext, DatabaseHelper.getSingleMeaning(searchResult.get(position), mContext), Toast.LENGTH_SHORT).show(); 
       String mean=DatabaseHelper.getSingleMeaning(searchResult.get(position),mContext); 
       meaning.setText(mean); 
      } 
     }); 
     swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() { 
      @Override 
      public void onDoubleClick(SwipeLayout layout, boolean surface) { 
       Toast.makeText(mContext, "DoubleClick", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     /*v.findViewById(R.id.delete).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(mContext, "click delete", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     */ 

     word = searchResult.get(position); 
     wrd.setText(word); 


     return v; 
    } 

此类扩展BaseSwipeAdapter它具有getView()方法如下面那里有getView()实现:

@Override 
    public final View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if(v == null){ 
      v = generateView(position, null,convertView); 
     } 
     mItemManger.bind(v, position); 
     fillValues(position, v); 
     return v; 
    } 

我知道“每一次的ListView需要在屏幕上显示一个新行,它将从其适配器调用getView()方法。“这就是为什么我加如果(v == null)但不working.But我做了这个调整在我的其他projects.It工作得很好,但在这个项目中它不工作。任何解决方案??预先感谢。

编辑:我尝试过使用ViewHolder,但没有working.Did我想念什么?

static class ViewHolder { 
     TextView wrd; 
     int position; 
    } 

    public DictListViewAdapter(Context mContext, ArrayList<String>searchResult) { 
     this.mContext = mContext; 
     this.searchResult = searchResult; 
    } 




    @Override 
    public int getSwipeLayoutResourceId(int position) { 
     return R.id.swipe; 
    } 

    @Override 
    public View generateView(final int position, ViewGroup parent,View v) { 
      ViewHolder viewHolder; 
      if(inflater==null){ 
       inflater = (LayoutInflater) mContext 
         .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      } 
      if(v==null) { 

       v = inflater.inflate(R.layout.listview_item,null); 
       viewHolder = new ViewHolder(); 
       viewHolder.wrd=(TextView) v.findViewById(R.id.word); 
       viewHolder.position=position; 
       v.setTag(viewHolder); 
      }else{ 
       viewHolder=(ViewHolder)v.getTag(); 
      } 


     viewHolder.wrd.setText(searchResult.get(position)); 
     final TextView meaning=(TextView)v.findViewById(R.id.meaning); 

     SwipeLayout swipeLayout = (SwipeLayout)v.findViewById(getSwipeLayoutResourceId(position)); 
     swipeLayout.addSwipeListener(new SimpleSwipeListener() { 
      @Override 
      public void onOpen(SwipeLayout layout) { 
       // YoYo.with(Techniques.Tada).duration(500).delay(100).playOn(layout.findViewById(R.id.trash)); 
       //Toast.makeText(mContext, DatabaseHelper.getSingleMeaning(searchResult.get(position), mContext), Toast.LENGTH_SHORT).show(); 
       String mean=DatabaseHelper.getSingleMeaning(searchResult.get(position),mContext); 
       meaning.setText(mean); 
      } 
     }); 
     swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() { 
      @Override 
      public void onDoubleClick(SwipeLayout layout, boolean surface) { 
       Toast.makeText(mContext, "DoubleClick", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     /*v.findViewById(R.id.delete).setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(mContext, "click delete", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     */ 

     return v; 
    } 
+0

我建议你为'ListView'使用'ViewHolder'模式 –

+0

为什么它不起作用??这个代码的任何调整? –

+0

你没有缓存视图,所以我建议使用'ViewHolder'模式 –

回答

0

,如果你要使用ViewHolder图案,然后检查generateView methos内空观点,那么你将不得不改变里面的代码BaseSwipeAdapter

@Override 
public final View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    // if(v == null){ 

    v = generateView(position, v, parent); 
    // } 
    mItemManger.bind(v, position); 
    fillValues(position, v); 
    return v; 
} 

评论这个空检查,现在尝试。