【发布时间】:2014-08-14 08:33:09
【问题描述】:
我的代码 expands LinearLayout 是 clicked。当列表中有 14 个或更少的项目时,它工作正常。一旦有超过 14 个项目,它就会重复引用。发生的情况是单击列表中的第一个项目会同时展开第一个和第 15 个项目。当有 300 个或更多项目时,它甚至看起来是随机的。我已经有一段时间没有运气了
这是我的自定义适配器
public class Scanvinadapter extends BaseAdapter {
private Activity activity;
private ArrayList data;
private static LayoutInflater inflater = null;
public Resources res;
Scanvinmodel model = null;
int i = 0;
ScanlistListener mCallback;
public Scanvinadapter(Activity a, ArrayList d, Resources resLocal){
activity = a;
data = d;
res = resLocal;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
try {
mCallback = (ScanlistListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement ScanlistListener");
}
}
@Override
public int getCount() {
if(data.size()<=0)
return 1;
return data.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public static class ViewHolder{
public TextView scanlistvin;
public TextView scanlistbay;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
LinearLayout ll = null;
ViewHolder holder;
if(convertView == null){
vi = inflater.inflate(R.layout.scanlistview, null);
holder = new ViewHolder();
ll = (LinearLayout) vi.findViewById(R.id.scanlist);
ll.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT,100));
Log.v("position", String.valueOf(position));
i = i+1;
vi.setId(i);
ll.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mCallback.scanlistclick(v, 0);
}
});
//vi.setOnClickListener(new OnItemClickListener( position ));
holder.scanlistvin = (TextView) vi.findViewById(R.id.scanlistvin);
holder.scanlistbay = (TextView) vi.findViewById(R.id.scanlistbay);
vi.setTag(holder);
}else
holder = (ViewHolder)vi.getTag();
if(data.size()<=0){
holder.scanlistvin.setText("No Data");
}else{
model = null;
model = (Scanvinmodel) data.get(position);
holder.scanlistvin.setText(model.getVin());
holder.scanlistbay.setText(model.getBay());
return vi;
}
return null;
}
public void onClick(View v) {
Log.v("CustomAdapter", "=====Row button clicked=====");
}
private class OnItemClickListener implements OnClickListener{
private int mPosition;
OnItemClickListener(int position){
mPosition = position;
}
@Override
public void onClick(View v) {
Log.v("CustomAdapter", String.valueOf(mPosition) );
mCallback.scanlistclick(v, mPosition);
}
}
public interface ScanlistListener{
public void scanlistclick(View v, int i);
}
}
这里是每次点击时调用的工具覆盖开始。我显示了 id,它似乎在重复 id。所有数据都是唯一的。
@Override
public void scanlistclick(View v, int i) {
new Animutils().expand(v);
Log.wtf("wtf", String.valueOf(v.getId()));
}
这是展开视图的动画
public class Animutils {
private static final long ANIMATION_DURATION = 250;
protected static final String TAG = "Animutils.java";
public void expand(final View v) {
//v.measure(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
final int targtetHeight = v.getMeasuredHeight();
//final int targtetHeight = 500;
//v.getLayoutParams().height = 114;
// v.setVisibility(View.VISIBLE);
Animation a = new Animation(){
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
//v.getLayoutParams().height = interpolatedTime == 1 ? LayoutParams.WRAP_CONTENT : (int)(targtetHeight * interpolatedTime);
//v.getLayoutParams().height = interpolatedTime == 1 ? 500 : (int)(targtetHeight + 25);
if(interpolatedTime == 0){
v.getLayoutParams().height = targtetHeight + 25;
}else{
if(v.getLayoutParams().height == 500){
cancel();
}else{
v.getLayoutParams().height = v.getLayoutParams().height +25;
}
}
v.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
};
// 1dp/ms
a.setDuration(ANIMATION_DURATION);
// a.setDuration((int)(targtetHeight / v.getContext().getResources().getDisplayMetrics().density));
v.startAnimation(a);
}
public void collapse(final View v) {
final int initialHeight = v.getMeasuredHeight();
Animation a = new Animation(){
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
if(interpolatedTime == 1){
v.setVisibility(View.GONE);
}else{
v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
v.requestLayout();
}
}
@Override
public boolean willChangeBounds() {
return true;
}
};
// 1dp/ms
a.setDuration(ANIMATION_DURATION);
// a.setDuration((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density));
v.startAnimation(a);
}
}
更新的适配器
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
LinearLayout ll = null;
ViewHolder holder;
if(convertView == null){
vi = inflater.inflate(R.layout.scanlistview, null);
ll = (LinearLayout) vi.findViewById(R.id.scanlist);
ll.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT,100));
holder = new ViewHolder();
holder.scanlist = (LinearLayout) vi.findViewById(R.id.scanlist);
holder.scanlistvin = (TextView) vi.findViewById(R.id.scanlistvin);
holder.scanlistbay = (TextView) vi.findViewById(R.id.scanlistbay);
Log.v("position", String.valueOf(position));
vi.setTag(holder);
}else{
holder = (ViewHolder)vi.getTag();
ll = holder.scanlist;
Log.v("position", String.valueOf(position));
}
ll.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mCallback.scanlistclick(v, 0);
}
});
if(data.size()<=0){
holder.scanlistvin.setText("No Data");
}else{
model = null;
model = (Scanvinmodel) data.get(position);
holder.scanlistvin.setText(model.getVin());
holder.scanlistbay.setText(model.getBay());
}
return vi;
}
【问题讨论】:
-
i = i+1; vi.setId(i);的目的是什么? getView 的调用次数可能比列表中的项目数多得多...
标签: android listview android-arrayadapter