2

嗨,我是这个机器人的新手。我只是对基本适配器感到困惑。我的问题是考虑在一个数组中我有 10 个项目(从 0 到 9)。在getview()baseadapter 的选项中,我在 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);

请帮我。提前致谢。

4

2 回答 2

1

我认为您没有完全掌握在适配器中完成的视图重用的概念。适配器与列表视图一起做的是,首先它为您可以看到的每个列表项创建一个视图。当您开始向下滚动时,最上面的视图不再可见,并且列表视图需要一个新的视图来显示新项目。现在,适配器不是释放消失的视图并分配一个全新的视图,而是为您提供消失的视图(as convertView),因此您不必分配一个新的视图(这相对耗时),您只需转换此视图以使其适合给定位置的项目。所以在你的情况下,当你得到一个非空值convertView 时,不要原封不动地返回它(因为那样它看起来与刚刚消失在顶部的那个相同),而是调整它以在给定位置显示项目,即相应地设置它的图像和文本。

顺便提一句。getelement()你不应该经常打电话给昂贵的。相反,只需在适配器的构造函数中调用它并存储返回的数组以供以后访问getCount()getView()

于 2012-11-12T08:09:19.200 回答
0

将任何类型的适配器与 ListView 一起使用是一件棘手的事情。您的问题本质上源于 ListView 重用了您膨胀的 View 或至少其中一些的事实。所以它会变成 7 或其他什么,然后当你滚动时重用一个现在不在屏幕上的视图。这就是您应该检查是否convertView为空的原因。我看到了一些东西,所以我会告诉你要移动什么。

您遇到的主要问题是删除您从中获得的 View 中的所有内容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,只有当它为空时。removeAllView另请注意,只有在 convertView 不为空时,您才会去's。无论如何,其他一切都应该始终运行。

编辑

好的,所以您不需要删除 RelativeLayout 中的所有视图,因为每次运行时,您都会替换它。试试我刚刚更改的内容。它应该工作。

在创建 ListView 框架的人的视频中查看此链接:ListView 世界

于 2012-11-12T07:27:37.850 回答