在BaseAdapter类中重置位置

时间:2012-11-12 07:07:38

标签: android baseadapter

嗨,我是这个机器人的新手。我只是被基础适配器搞糊涂了。我的问题是考虑在数组中我有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);

请帮帮我。提前谢谢。

2 个答案:

答案 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