gpt4 book ai didi

java - 使用自定义适配器在一个 ListView 中膨胀两个布局的问题

转载 作者:行者123 更新时间:2023-11-29 22:21:37 25 4
gpt4 key购买 nike

我在一个 ListView 中膨胀两个布局。数据为 json 格式。我所做的是将 json 连接在一起,并检查每个布局的适当位置(第一个布局只出现在位置 0 到第一个 json 的长度 - 1 之间)。

当 ListView 变长时出现问题,我可以向下滚动它。它出现了空指针异常。所以我评论了一些代码,错误消失了。但我得到的并不是我所期待的:它随机交换格式。 (假设第一个 json 的长度是 x,所以 0 到 x-1 应该是第一个布局。但是当我向上和向下滚动时,有时 0 和 x 之间的某个地方变为第二个布局。以及其他行 > x,有时更改为第一个布局)

这是适配器的代码

public class CustomAdapter extends BaseAdapter {

private Activity activity;
private JSONArray data;
private static LayoutInflater inflater=null;
private SecondItem second_item;
private FirstItem first_item;
private int firstLength;
private boolean hasFirst = false;

public CustomAdapter(Activity a, JSONArray firstArray, JSONArray secondArray) {
activity = a;
first_item = new FirstItem (firstArray);
second_item = new SecondItem (secondArray);
firstLength = first_item.getLength();
if (!firstArray.isNull(0)) {
data=CustomUtils.concatJsonArray(firstArray, secondArray);
hasFirst = true;
}
else
data = secondArray;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

public int getCount() {
// TODO Auto-generated method stub
return data.length();
}

public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}

public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

public static class ViewHolder{
public TextView txt_both;
public TextView txt_first_only;
...
}

public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View vi=convertView;
ViewHolder holder;
if(convertView==null){
if (position < firstLength && hasFirst) {
vi = inflater.inflate(R.layout.first_item, null);
}
else {
vi = inflater.inflate(R.layout.second_item, null);
}


holder=new ViewHolder();
holder.txt_both=(TextView)vi.findViewById(R.id.txt_both);
...

if (position < firstLength && hasFirst) {
holder.txt_firstOnly=(TextView)vi.findViewById(R.id.txt_firstOnly);
...

}
vi.setTag(holder);
}
else
holder=(ViewHolder)vi.getTag();

if (position < firstLength && hasFirst) {
holder.txt_both.setText(first_item.getContent(position));
...

这里是注释 block ,它导致之前的空指针异常(错误点在行holder.txt_firstOnly.setText):

        /*if (first_item.getStatus(position)==0) {
holder.txt_firstOnly.setText(...);

}
else if (first_item.getStatus(position)==1) {
holder.txt_firstOnly.setText(...);
}
else if (first_item.getStatus(position)==2) {
holder.txt_firstOnly.setText(...);

} */

下面是剩下的代码:

        }
else {
holder.txt_both.setText(second_item.getContent(position - firstLength));
...

}

return vi;
}


}

最佳答案

您的自定义适配器应覆盖方法 getViewTypeCount()getItemViewType (int position)。现在,操作系统认为所有 View 都具有相同的 View 类型,因此它任意传入一个先前创建的 View 。如您所见,有时这不是该职位的正确观点。

关于java - 使用自定义适配器在一个 ListView 中膨胀两个布局的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7029091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com