0

私のリストビューはアイテムがランダムに並べられています。下または上にスクロールすると、アイテムの位置がランダムに変更されました。これを修正するために多くの方法を試しましたが、成功しませんでした

私はグーグルで検索しましたが、展開されたリストビューに関連するこの問題を修正する方法が多すぎますが、私のコードでは機能しません

助けてください

これはリストビューのコードです

static class ViewHolder {
      ImageView play;
      ImageView download;
      TextView rtitle;
      TextView size;
      TextView downloads;
      RatingBar ratingsmall;
      ImageView ratebutton;
      long tonid;
      TextView voters;
    }
    public View getView(int position, View convertView, ViewGroup parent) {
      ViewHolder holder;
      //Get the current location object
      JSONObject r = (JSONObject) getItem(position);
      //Inflate the view
      if (convertView == null) {
        convertView = mInflater.inflate(R.layout.ringtone_bit, null);
        holder = new ViewHolder();
        ImageView play = (ImageView) convertView.findViewById(R.id.play);
        ImageView download = (ImageView) convertView.findViewById(R.id.download);
        ImageView ratebutton = (ImageView) convertView.findViewById(R.id.ratebutton);
        TextView rtitle = (TextView) convertView.findViewById(R.id.rtitle);
        TextView size = (TextView) convertView.findViewById(R.id.size);
        TextView downloads = (TextView) convertView.findViewById(R.id.downloads);
        TextView voters = (TextView) convertView.findViewById(R.id.voters);
        TextView personname = (TextView) convertView.findViewById(R.id.personname);
        TextView date = (TextView) convertView.findViewById(R.id.date);
        RatingBar ratingsmall = (RatingBar) convertView.findViewById(R.id.ratingsmall);
        //setdate
        try {
          Date date_g = new Date(r.getLong("timestamp") * 1000);
          date.setText(date_g.toLocaleString());
        } catch (JSONException e2) {}
        //set person name
        try {
          String client_name = (r.getString("personname").equals("null") == true) ? "ghost" : r.getString("personname");
          personname.setText(client_name);
        } catch (JSONException e2) {}
        //set total votars and vote avarage
        try {
          float z = (float) r.getInt("rate");
          voters.setText(" ( " + r.getLong("voters") + " ) / " + z);
        } catch (JSONException e2) {}
        //set rating bar
        try {
          float z = (float) r.getInt("rate");
          ratingsmall.setRating(z);
        } catch (JSONException e2) {}
        //set ringtone Name as defualt device language
        try {
          String name = (lang.equals("English") == true) ? r.getString("en_name") : r.getString("ar_name");
          rtitle.setText(name);
        } catch (JSONException e2) {}
        //ringtone file size
        try {
          size.setText(r.getString("size"));
        } catch (JSONException e2) {}
        //set downloads
        try {
          downloads.setText(String.valueOf(r.getLong("downloads")));
        } catch (JSONException e2) {}
        //set ringtone ID toneid
        try {
          holder.tonid = r.getLong("toneid");
          download.setTag(r.getLong("toneid"));
          ratebutton.setTag(r.getLong("toneid"));
        } catch (JSONException e1) {}
        //set download stram url to play icon
        try {
          play.setTag(r.getString("stream_url"));
        } catch (JSONException e) {}
        //add play listener test Ringtone before download it
        play.setOnClickListener(onClickListener);
        convertView.setTag(holder);
      } else {
        holder = (ViewHolder) convertView.getTag();
      }
      return convertView;
    }
4

3 に答える 3

3

ViewHolder の目的を誤解していると思います。ViewHolder は値を保持するのではなく、ビューを保持するためのものなので、それらを再び膨らませる必要はありません。タグからビューを取得する場合でも、データを設定する必要があります。

これは、ビューホルダーを正しく使用する方法です:

if(convertView == null)
{
    convertView = mInflater.inflate(R.layout.ringtone_bit, null);
    holder = new ViewHolder();
    convertView.setTag(holder);
    holder.play        = ( ImageView ) convertView.findViewById(R.id.play);
    holder.download    = ( ImageView ) convertView.findViewById(R.id.download);
    holder.ratebutton  = ( ImageView ) convertView.findViewById(R.id.ratebutton);
    holder.rtitle      = (TextView)  convertView.findViewById(R.id.rtitle);
    holder.size        = (TextView)  convertView.findViewById(R.id.size);
    holder.downloads   = (TextView)  convertView.findViewById(R.id.downloads);
    holder.voters      = (TextView)  convertView.findViewById(R.id.voters);
    holder.personname   = (TextView)  convertView.findViewById(R.id.personname);
    holder.date         = (TextView)  convertView.findViewById(R.id.date);
    holder.ratingsmall = (RatingBar) convertView.findViewById(R.id.ratingsmall);
} else {
    holder = (ViewHolder) convertView.getTag();
}

// Fill the data
于 2013-04-25T16:53:09.107 に答える
0
//Get the current location object
JSONObject r = (JSONObject) getItem(position);

//Inflate the view
if(convertView == null)
{
    convertView = mInflater.inflate(R.layout.ringtone_bit, null);
}

         ImageView play        = ( ImageView ) convertView.findViewById(R.id.play);
    ImageView download    = ( ImageView ) convertView.findViewById(R.id.download);
    ImageView ratebutton  = ( ImageView ) convertView.findViewById(R.id.ratebutton);
    TextView  rtitle      = (TextView)  convertView.findViewById(R.id.rtitle);
    TextView  size        = (TextView)  convertView.findViewById(R.id.size);
    TextView  downloads   = (TextView)  convertView.findViewById(R.id.downloads);
    TextView  voters      = (TextView)  convertView.findViewById(R.id.voters);
    TextView personname   = (TextView)  convertView.findViewById(R.id.personname);
    TextView date         = (TextView)  convertView.findViewById(R.id.date);
    RatingBar ratingsmall = (RatingBar) convertView.findViewById(R.id.ratingsmall);


   //setdate
    try {
        Date date_g = new Date(r.getLong("timestamp")*1000);
        date.setText( date_g.toLocaleString() ) ; 

    } catch (JSONException e2) {}


   //set person name
    try {
        String client_name = ( r.getString("personname").equals( "null" ) == true ) ? "ghost" : r.getString("personname");
        personname.setText(client_name);
    } catch (JSONException e2) {}

    //set total votars and vote avarage
    try {
        float z = (float) r.getInt("rate");
        voters.setText(" ( "+ r.getLong("voters") +" ) / " + z);
    } catch (JSONException e2) {}            
    //set rating bar
    try {
        float z = (float) r.getInt("rate");
        ratingsmall.setRating(z);
    } catch (JSONException e2) {}           
    //set ringtone Name as defualt device language
    try {
        String name = ( lang.equals( "English" ) == true ) ?  r.getString("en_name") : r.getString("ar_name");
        rtitle.setText(name);
    } catch (JSONException e2) {}

    //ringtone file size
    try {
        size.setText(r.getString("size"));
    } catch (JSONException e2) {}

    //set downloads
    try {
        downloads.setText(String.valueOf( r.getLong("downloads") ));
    } catch (JSONException e2) {}

    //set ringtone ID toneid
    try {
          holder.tonid = r.getLong("toneid");
          download.setTag(r.getLong("toneid"));
          ratebutton.setTag(r.getLong("toneid"));
       } catch (JSONException e1) {}

    //set download stram url to play icon
    try {
        play.setTag(r.getString("stream_url"));
    } catch (JSONException e) {}

    //add play listener test Ringtone before download it
    play.setOnClickListener(onClickListener); 


return convertView;

ビューホルダーは奇妙で、通常は混乱を引き起こします。これが私が実装することをお勧めする方法ですgetView()

于 2013-04-25T16:47:20.080 に答える