嗨,我是这个机器人的新手。我只是被基础适配器搞糊涂了。我的问题是考虑在数组中我有10个项目(从0到9)。在baseadapter的getview()
选项中,我在textview中显示它。但在再次正确执行5次之后,位置重置为0.因此项目重复两次。
这是我的适配器类:
public class ListViewwithimageAdapter extends BaseAdapter
{
private static Context contxt;
final String URL = "http://xxxx.in/SSDAA.xml";
final String[] kickerimage = new String[150];
ListViewwithimageAdapter(Context conxt)
{
// System.out.println("inside cons");
this.contxt=conxt;
}
{
}
public String[] getelement()
{
// System.out.println("Insid getelement");
ArrayList<String> menuItems = new ArrayList<String>();
TaplistingParser parser = new TaplistingParser();
String xml= parser.getXmlFromUrl(URL);
Document doc=parser.getDomElement(xml);
// System.out.println("sssss="+doc);
NodeList nl=doc.getElementsByTagName("article");
final String[] url= new String[nl.getLength()];
// String headings = null;
for(int i=0; i < nl.getLength(); i++ )
{
// System.out.println("i="+i);
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
// map.put("Title", parser.getValue(e, "title"));
// map.put("Date", parser.getValue(e, "create_date"));
url[i]=parser.getValue(e, "url");
// System.out.println("b4 kick");
// System.out.println("value="+parser.getValue(e, "title"));
kickerimage[i]=parser.getValue(e, "kickerimage");
// System.out.println("after kick");
// System.out.println("kick="+kickerimage[i]);
menuItems.add(parser.getValue(e, "title"));
}
// System.out.println("b4 items array");
String[] itemsarray = new String[menuItems.size()];
// System.out.println("subbu");
itemsarray=menuItems.toArray(itemsarray);
// System.out.println("subbu1");
// System.out.println("in last");
return itemsarray;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return getelement().length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return getelement()[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
// System.out.println("pos in id="+position);
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
// TODO Auto-generated method stub
System.out.println("pos in id="+position); ------------------->This soutline gives output as(0,1,2,3,4,5,0).
Bitmap bitmap = DownloadImage(
kickerimage[position] );
LayoutInflater inflater = (LayoutInflater) contxt
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View listView;
if (convertView == null)
{
listView = new View(contxt);
listView = inflater.inflate(R.layout.homelistrow, null);
System.out.println("pos="+position);
System.out.println("item="+getItem(position));
TextView textView = (TextView) listView
.findViewById(R.id.name_label);
textView.setText(getelement()[position]);
ImageView imageView = (ImageView) listView
.findViewById(R.id.icon);
imageView.setImageBitmap(bitmap);
}
else
{
listView = (View) convertView;
}
return listView;
}
private Bitmap DownloadImage(String URL)
{
// System.out.println("image inside="+URL);
Bitmap bitmap = null;
InputStream in = null;
try {
in = OpenHttpConnection(URL);
bitmap = BitmapFactory.decodeStream(in);
in.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// System.out.println("image last");
return bitmap;
}
private InputStream OpenHttpConnection(String urlString)
throws IOException
{
InputStream in = null;
int response = -1;
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
if (!(conn instanceof HttpURLConnection))
throw new IOException("Not an HTTP connection");
try{
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setAllowUserInteraction(false);
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.connect();
response = httpConn.getResponseCode();
if (response == HttpURLConnection.HTTP_OK) {
in = httpConn.getInputStream();
}
}
catch (Exception ex)
{
throw new IOException("Error connecting");
}
return in;
}
}
我的主页:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView
android:id="@+id/icon"
android:layout_width="80dp"
android:layout_height="80dp"
android:paddingLeft="10dp"
android:paddingRight="10dp" />
<TextView
android:id="@+id/name_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/icon"
android:paddingBottom="10dp"
android:textColor="#ffffff"
android:textSize="16dp" />
</RelativeLayout>
在我的活动设置适配器中:
ListView l2= (ListView)findViewById(R.id.list);
ListViewwithimageAdapter adapter = new ListViewwithimageAdapter(this);
l2.setAdapter(adapter);
请帮帮我。提前谢谢。
答案 0 :(得分:1)
我认为你没有完全掌握在适配器中完成的视图重用的概念。
适配器与listview的作用是,首先它为您可以看到的每个列表项创建一个视图。当您开始向下滚动时,最顶层的视图不再可见,并且列表视图需要一个新视图才能进入视图。现在,适配器不是释放消失的视图并分配全新的视图,而是为您提供消失的视图(如convertView
),因此您不必分配新的视图(相对时间成本很高),您只需转换此视图使其适合给定位置的项目。
因此,在您的情况下,当您获得非空convertView
时,请不要将其更改为未更改(因为那时它看起来与刚刚在顶部消失的那个相同),但是而是调整它以显示给定位置的项目,即相应地设置它的图像和文本。
顺便说一下。你不应该经常打电话给昂贵的getelement()
。相反,只需在适配器的构造函数中调用它并存储返回的数组,以便以后getCount()
,getView()
等访问。
答案 1 :(得分:0)
将任何类型的适配器与ListView一起使用是一项棘手的工作。您的问题主要源于ListView重用您膨胀的View或至少其中一些。因此,它会像7或其他任何东西,然后当你滚动字面重复使用现在离开屏幕的视图。这就是您要检查convertView
是否为空的原因。我看到了一些事情,所以我会告诉你要走动的地方。
您遇到的主要问题是清除视图中从convertView
获得的所有内容。
public View getView(int position, View convertView, ViewGroup parent)
{
// TODO Auto-generated method stub
System.out.println("pos in id="+position);
Bitmap bitmap = DownloadImage(
kickerimage[position] );
if (convertView == null)
{
//this should only ever run if you do not get a view back
LayoutInflater inflater = (LayoutInflater) contxt
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.homelistrow, null);
}
TextView textView = (TextView) convertView
.findViewById(R.id.name_label);
textView.setText(getelement()[position]);
ImageView imageView = (ImageView) convertView
.findViewById(R.id.icon);
imageView.setImageBitmap(bitmap);
return convertView;
}
所以你看到holder.removeAllViews();
,那就是关键。 ListView不保证调用getView()
多少次(这就是为什么你看到位置变化很多甚至重复)。它可以在你之前调用过的东西上调用,因此重复的条目。请记住,视图已被回收。想象一下整个行只是被重用了。因此,之前的任何内容仍将存在,这就是为什么你必须删除所有内容并且每次都重新开始。你可能已经注意到我也动了一些东西。仔细看看为什么。当你可以正确使用convertView
时,没有理由创建一个新的视图,只有当它为null时。另请注意,仅当convertView不为null时才会转到removeAllView
。其他一切都应该始终运行。
修改强>
好的,所以你不需要删除RelativeLayout中的所有视图,因为每次运行它都会替换它。试试我刚刚改变的内容。它应该工作。
由创建ListView框架的人查看视频中的此链接:World of ListView