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'模式 –