2015-06-24 94 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; 
} 

評論這個空檢查,現在嘗試。