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;
}
我建議你爲'ListView'使用'ViewHolder'模式 –
爲什麼它不起作用??這個代碼的任何調整? –
你沒有緩存視圖,所以我建議使用'ViewHolder'模式 –