2

こんにちは、私はこのアンドロイドが初めてです。ベースアダプターに混乱しています。私の問題は、配列に10個のアイテム(0から9まで)があることを考慮することです。getview()baseadapterのオプションで、これをテキストビューで表示しています。しかし、もう一度正しく 5 回実行した後、位置は 0 にリセットされます。したがって、アイテムは 2 回繰り返されます。

これは私のアダプタクラスです:

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) 提供するため、新しいビューを割り当てる代わりに (比較的時間がかかります) 、このビューを変換して適切にする必要があります。指定された位置にあるアイテム。したがって、あなたの場合、null以外を取得しても、convertView 変更せずに返さないでください(上部に消えたものと同じように見えるため) 代わりに、指定された位置にアイテムを表示するように微調整します。つまり、画像とテキストをそれに応じて設定します。

ところで。コストのかかるものをそれほど頻繁に呼び出すべきではありませんgetelement()。代わりに、アダプターのコンストラクターで呼び出し、返された配列を後でアクセスできるように格納しgetCount()ますgetView()

于 2012-11-12T08:09:19.200 に答える
0

ListView で任意のタイプのアダプタを使用するのは、注意が必要です。あなたの問題は本質的に、ListView が膨張させたビュー、または少なくともそれらのいくつかを再利用するという事実に起因しています。したがって、7 か何かのようになり、スクロールすると、画面から外れているビューを文字通り再利用します。convertViewこれが、 nullかどうかを確認する理由です。いくつか見落としがあるので、何を動かせばいいのか教えてあげましょう。

あなたが抱えている主な問題は、から取得したビュー内のすべてを消去することです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 の場合のみです。またremoveAllView、convertView が null でない場合にのみ 's に移動することに注意してください。他のすべては、関係なく常に実行する必要があります。

編集

わかりました。RelativeLayout 内のすべてのビューを削除する必要はありません。実行するたびに置き換えられるからです。変更したばかりのものを試してください。それはうまくいくはずです。

ListView フレームワークを作成した人物によるビデオのこのリンクをチェックしてください: World of ListView

于 2012-11-12T07:27:37.850 に答える