在Android中,当在ListView中滚动时,Listitems会改变位置
我是Android新手,我正在开发一个包含图像和一些文本的自定义列表项的在Android中,当在ListView中滚动时,Listitems会改变位置,android,listview,adapter,android-adapter,Android,Listview,Adapter,Android Adapter,我是Android新手,我正在开发一个包含图像和一些文本的自定义列表项的列表视图,当我向上/向下滚动列表视图时发现了一个问题。列表项的位置正在改变。有人能帮我吗?我将我的适配器发布在这里供您参考。希望你能帮我弄明白 OfferAdapter public class OfferAdapter extends BaseAdapter { private Context mContext; private ArrayList<Offer> OfferList;
列表视图,当我向上/向下滚动列表视图时发现了一个问题。列表项的位置正在改变。有人能帮我吗?我将我的适配器发布在这里供您参考。希望你能帮我弄明白
OfferAdapter
public class OfferAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<Offer> OfferList;
public OfferAdapter(Context c, ArrayList<Offer> OfferList) {
mContext = c;
this.OfferList = OfferList;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return OfferList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@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
View grid;
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
grid = new View(mContext);
grid = inflater.inflate(R.layout.raw_offer, null);
TextView tv_ofr_hdr = (TextView) grid.findViewById(R.id.tv_ofr_hdr);
ImageView iv_pic = (ImageView) grid.findViewById(R.id.iv_pic);
TextView tv_ofr_desc = (TextView) grid.findViewById(R.id.tv_ofr_desc);
TextView tv_date = (TextView) grid.findViewById(R.id.tv_date);
tv_ofr_desc.setText(OfferList.get(position).getDescription());
tv_ofr_hdr.setText(OfferList.get(position).getHeadline());
Date from = new Date();
Date to = new Date();
SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat output = new SimpleDateFormat("dd/MM/yyyy");
try {
from = input.parse(OfferList.get(position).getStart_date());
to = input.parse(OfferList.get(position).getEnd_date()); // parse input
} catch (ParseException e) {
e.printStackTrace();
}
tv_date.setText(output.format(from) + " TO " + output.format(to));
Picasso.with(mContext)
.load(OfferList.get(position).getPhoto().replaceAll(" ", "%20"))
.placeholder(R.drawable.ic_no_img)
.error(R.drawable.ic_no_img)
.into(iv_pic);
} else {
grid = (View) convertView;
}
return grid;
}
}
公共类OfferAdapter扩展了BaseAdapter{
私有上下文;
私人律师事务所;
公共报价器(上下文c,数组列表报价器){
mContext=c;
this.OfferList=OfferList;
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回OfferList.size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回null;
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
视图网格;
LayoutFlater充气器=(LayoutFlater)mContext
.getSystemService(上下文布局\充气机\服务);
if(convertView==null){
网格=新视图(mContext);
网格=充气机。充气(R.layout.raw_offer,空);
TextView tv_of R_hdr=(TextView)grid.findviewbyd(R.id.tv_of R_hdr);
ImageView iv_pic=(ImageView)grid.findViewById(R.id.iv_pic);
TextView tv_of R_desc=(TextView)grid.findviewbyd(R.id.tv_of R_desc);
TextView tv_date=(TextView)grid.findViewById(R.id.tv_date);
tv_of r_desc.setText(OfferList.get(position.getDescription());
tv_of r_hdr.setText(OfferList.get(position.getHeadline());
日期从=新日期();
日期至=新日期();
SimpleDataFormat输入=新的SimpleDataFormat(“yyyy-MM-dd”);
SimpleDataFormat输出=新的SimpleDataFormat(“dd/MM/yyyy”);
试一试{
from=input.parse(OfferList.get(position.getStart_date());
to=input.parse(OfferList.get(position.getEnd_date());//解析输入
}捕获(解析异常){
e、 printStackTrace();
}
tv_date.setText(output.format(from)+“到”+output.format(TO));
毕加索(McContext)
.load(OfferList.get(position.getPhoto().replaceAll(“,“%20”))
.占位符(R.drawable.ic\u no\u img)
.错误(R.drawable.ic\u no\u img)
。加入(iv_pic);
}否则{
网格=(视图)转换视图;
}
返回网格;
}
}
您需要修改getView()方法,如下所示-
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View grid = convertView;
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (grid == null) {
grid = inflater.inflate(R.layout.raw_offer, parent, false);
}
TextView tv_ofr_hdr = (TextView) grid.findViewById(R.id.tv_ofr_hdr);
ImageView iv_pic = (ImageView) grid.findViewById(R.id.iv_pic);
TextView tv_ofr_desc = (TextView) grid.findViewById(R.id.tv_ofr_desc);
TextView tv_date = (TextView) grid.findViewById(R.id.tv_date);
tv_ofr_desc.setText(OfferList.get(position).getDescription());
tv_ofr_hdr.setText(OfferList.get(position).getHeadline());
Date from = new Date();
Date to = new Date();
SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat output = new SimpleDateFormat("dd/MM/yyyy");
try {
from = input.parse(OfferList.get(position).getStart_date());
to = input.parse(OfferList.get(position).getEnd_date()); // parse input
} catch (ParseException e) {
e.printStackTrace();
}
tv_date.setText(output.format(from) + " TO " + output.format(to));
Picasso.with(mContext)
.load(OfferList.get(position).getPhoto().replaceAll(" ", "%20"))
.placeholder(R.drawable.ic_no_img)
.error(R.drawable.ic_no_img)
.into(iv_pic);
return grid;
}
你还需要覆盖这两种方法-
@Override
public int getViewTypeCount() {
return getCount();
}
@Override
public int getItemViewType(int position) {
return position;
}
更改一些适配器方法,如-
@Override
public Offer getItem(int position) {
// TODO Auto-generated method stub
return OfferList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
所以你的适配器应该是-
public class OfferAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<Offer> OfferList;
public OfferAdapter(Context c, ArrayList<Offer> OfferList) {
mContext = c;
this.OfferList = OfferList;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return OfferList.size();
}
@Override
public Offer getItem(int position) {
// TODO Auto-generated method stub
return OfferList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View grid;
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
grid = new View(mContext);
grid = inflater.inflate(R.layout.raw_offer, null);
TextView tv_ofr_hdr = (TextView) grid.findViewById(R.id.tv_ofr_hdr);
ImageView iv_pic = (ImageView) grid.findViewById(R.id.iv_pic);
TextView tv_ofr_desc = (TextView) grid.findViewById(R.id.tv_ofr_desc);
TextView tv_date = (TextView) grid.findViewById(R.id.tv_date);
tv_ofr_desc.setText(OfferList.get(position).getDescription());
tv_ofr_hdr.setText(OfferList.get(position).getHeadline());
Date from = new Date();
Date to = new Date();
SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat output = new SimpleDateFormat("dd/MM/yyyy");
try {
from = input.parse(OfferList.get(position).getStart_date());
to = input.parse(OfferList.get(position).getEnd_date()); // parse input
} catch (ParseException e) {
e.printStackTrace();
}
tv_date.setText(output.format(from) + " TO " + output.format(to));
Picasso.with(mContext)
.load(OfferList.get(position).getPhoto().replaceAll(" ", "%20"))
.placeholder(R.drawable.ic_no_img)
.error(R.drawable.ic_no_img)
.into(iv_pic);
} else {
grid = (View) convertView;
}
return grid;
}
}
公共类OfferAdapter扩展了BaseAdapter{
私有上下文;
私人律师事务所;
公共报价器(上下文c,数组列表报价器){
mContext=c;
this.OfferList=OfferList;
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回OfferList.size();
}
@凌驾
公开发售getItem(内部位置){
//TODO自动生成的方法存根
返回OfferList.get(位置);
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
视图网格;
LayoutFlater充气器=(LayoutFlater)mContext
.getSystemService(上下文布局\充气机\服务);
if(convertView==null){
网格=新视图(mContext);
网格=充气机。充气(R.layout.raw_offer,空);
TextView tv_of R_hdr=(TextView)grid.findviewbyd(R.id.tv_of R_hdr);
ImageView iv_pic=(ImageView)grid.findViewById(R.id.iv_pic);
TextView tv_of R_desc=(TextView)grid.findviewbyd(R.id.tv_of R_desc);
TextView tv_date=(TextView)grid.findViewById(R.id.tv_date);
tv_of r_desc.setText(OfferList.get(position.getDescription());
tv_of r_hdr.setText(OfferList.get(position.getHeadline());
日期从=新日期();
日期至=新日期();
SimpleDataFormat输入=新的SimpleDataFormat(“yyyy-MM-dd”);
SimpleDataFormat输出=新的SimpleDataFormat(“dd/MM/yyyy”);
试一试{
from=input.parse(OfferList.get(position.getStart_date());
to=input.parse(OfferList.get(position.getEnd_date());//解析输入
}捕获(解析异常){
e、 printStackTrace();
}
tv_date.setText(output.format(from)+“到”+output.format(TO));
毕加索(McContext)
.load(OfferList.get(position.getPhoto().replaceAll(“,“%20”))
.占位符(R.drawable.ic\u no\u img)
.错误(R.drawable.ic\u no\u img)
。加入(iv_pic);
}否则{
网格=(视图)转换视图;
}
返回网格;
}
}
您的问题在于getView()
实现中,并且源于对方法参数的作用以及该方法如何填充列表视图的误解。这是完全可以理解的<代码>列表视图有点复杂
需要了解的重要一点是,ListView
将建立一个视图的“池”,然后回收它们,这样就不需要每次重新创建它们
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View grid;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
grid = inflater.inflate(R.layout.raw_offer, parent, false);
} else {
grid = convertView;
}
TextView tv_ofr_hdr = (TextView) grid.findViewById(R.id.tv_ofr_hdr);
ImageView iv_pic = (ImageView) grid.findViewById(R.id.iv_pic);
TextView tv_ofr_desc = (TextView) grid.findViewById(R.id.tv_ofr_desc);
TextView tv_date = (TextView) grid.findViewById(R.id.tv_date);
tv_ofr_desc.setText(OfferList.get(position).getDescription());
tv_ofr_hdr.setText(OfferList.get(position).getHeadline());
Date from = new Date();
Date to = new Date();
SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat output = new SimpleDateFormat("dd/MM/yyyy");
try {
from = input.parse(OfferList.get(position).getStart_date());
to = input.parse(OfferList.get(position).getEnd_date()); // parse input
} catch (ParseException e) {
e.printStackTrace();
}
tv_date.setText(output.format(from) + " TO " + output.format(to));
Picasso.with(mContext)
.load(OfferList.get(position).getPhoto().replaceAll(" ", "%20"))
.placeholder(R.drawable.ic_no_img)
.error(R.drawable.ic_no_img)
.into(iv_pic);
return grid;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public Object getItem(int position) {
return OfferList.get(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View grid;
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
grid = new View(mContext);
grid = inflater.inflate(R.layout.raw_offer, null);
// [all that initializing stuff]
} else {
grid = (View) convertView;
}
return grid;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View grid;
if (convertView == null) {
grid = inflater.inflate(R.layout.raw_offer, parent, false);
} else {
grid = convertView;
}
// [all that initializing stuff]
return grid;
}