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 回答
1

如果convertView != null. 您应该阅读另一个使用 viewHolder 的示例。这次检查得更仔细了。

于 2013-04-25T16:44:27.440 回答
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 回答