4

カスタム ArrayAdapter を使用してリストを作成する ListFragment を実装しています。各行アイテムには、ImageView と 3 つの TextViews があります。データは XML 経由で解析され、画像は非同期で読み込まれます。

私が抱えている問題は、ListView が読み込まれて見栄えが良いことですが、スクロール時に問題があります。画面に一度に 7 個のアイテムを収めることができます。8行目までスクロールすると、突然変化して、次の行が表示されるはずです。8 で割り切れる行 (つまり、行 8、16、24 など) でのみ実行されます。

この ListView で速度を確保するために、ViewHolder パターンを使用しています。問題はどこかにあると思いますが、検索したところ、このパターンを正しく実行しているようで、この問題を解決するためにチェックするものが不足しているようです。私は何を間違っていますか?ありがとう!

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    MyViewHolder holder;
    if (row == null) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        row = inflater.inflate(R.layout.browse_result_list_item, null, false);
        holder = new MyViewHolder();
        holder.adTitle = (TextView) row.findViewById(R.id.adTitle);
        holder.region = (TextView) row.findViewById(R.id.region);
        holder.time = (TextView) row.findViewById(R.id.time);
        holder.thumbnail = (ImageView) row.findViewById(R.id.browseThumbnail);
        row.setTag(holder);
    } else {
        holder = (MyViewHolder) row.getTag();
    }
    SearchResult result = mObjects.get(position);

    holder.adTitle.setText(result.getTitle().substring(0, result.getTitle().length()-3)); // three ... at the end, remove them
    holder.region.setText(result.getRegion());
    holder.time.setText(result.getPostingTime());

    // Download the image thumbnail
    ArrayList<String> urls = result.getImageUrls();
    if (urls.size() > 0)
        download(urls.get(0), holder.thumbnail);
    else // No image for this post, put a placeholder
        holder.thumbnail.setImageResource(R.drawable.ic_action_picture);

    return row;
}

private static class MyViewHolder {
    public static TextView adTitle;
    public static TextView region;
    public static TextView time;
    public static ImageView thumbnail;
}

編集: @frozenkoi のおかげで解決策が見つかりました。問題を引き起こすViewHolder内の静的変数になってしまいました。それらは現在単にパブリックであり、クラスは静的であり、問​​題は解決されています。

4

5 に答える 5

3

まず、このメソッドでgetView()メソッド intoを定義し、 elseconvertView=null;条件 をコメントして、;を追加します。また、ViewHolder クラスのように、各ビュー アイテムから static キーワードを削除します。int type = getItemViewType(position)Textview, ImageView

注: アダプターで getViewTypeCount() と getItemViewType() をオーバーライドします。

if(convertView == null){
 switch (type) {
            case 0:
                  //First view[Row layout]
            break;
            case 1:
                 //Second view[Row layout]
            break;

            //another Case here....

   convertView.setTag(holder);

  //remove else part when used convertView =null;
        /*else {
        holder = (MyViewHolder) row.getTag();
    }*/

} 

@Override
    public int getItemViewType(int position) {
        // TODO Auto-generated method stub
        map = list.get(position); 
        message_type = map.get("message_type");
        if (message_type.equalsIgnoreCase("TEXT")) {
            return 0;
        } else {
            return 1;
        }

    }

    @Override
    public int getViewTypeCount() {
        // TODO Auto-generated method stub
        if (getCount() != 0)
            return getCount();
        return 2;
    }

今やれ!終わり!

于 2015-08-05T11:48:15.073 に答える
3

@frozenkoi のおかげで解決策を見つけました。問題を引き起こすViewHolder内の静的変数になってしまいました。それらは単純にパブリックになり、クラスは静的になり、問題は解決されました。

private static class MyViewHolder {
    public TextView adTitle;
    public TextView region;
    public TextView time;
    public ImageView thumbnail;
}
于 2013-11-04T02:14:34.647 に答える
1

これらのコード行をアダプター クラスに追加するだけです。

@Override
public int getViewTypeCount() {

    if (getCount() != 0)
        return getCount();

    return 1;
}

それがあなたの問題を解決することを願っています。

于 2013-11-03T18:37:26.523 に答える
0

私の場合、復帰は状態で忘れられていましたif else:

/*public class ContactAdapter extends BaseAdapter {
    public List<Contact> _data;
    private ArrayList<Contact> arraylist;
    Context _c;
    ViewHolder holder;

public ContactAdapter(List<Contact> contacts, Context context) {
    _data = contacts;
    _c = context;
    this.arraylist = new ArrayList<Contact>();
    this.arraylist.addAll(_data);
}*/
@Override
public View getView(final int i,  View convertView, final ViewGroup viewGroup) {
    View view = convertView;
    final Contact data = (Contact) _data.get(i);
    ViewHolder holder ;

    if (view == null) {
        Context context = viewGroup.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        view = inflater.inflate(R.layout.contact_list, null,false);
        holder = new ViewHolder();
        holder.title = (TextView) view.findViewById(R.id.name);
        holder.imageView = (ImageView) view.findViewById(R.id.pic);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }

    holder.title.setText(data.getName());
    // Set image if is null string
    if(!data.getThumb().equals("null")){
        try {
             Bitmap myBitmap = BitmapFactory.decodeFile(ImageStorage.getImage(data.getThumb()).getAbsolutePath());
             holder.imageView.setImageBitmap(myBitmap);
            }catch (Exception e){e.printStackTrace();
             holder.imageView.setImageResource(R.mipmap.contactimage);
          }

    }else // I had forgotten this else 
        holder.imageView.setImageResource(R.mipmap.contactimage); 


    // same action with background color
    if(data.getId()==data.getFromContact() ){
         view.setBackgroundColor(Color.RED);
     } else{
         view.setBackgroundColor(Color.WHITE); //**revert back it**
     }
        return view;
}

ビューホルダー

  private  static class ViewHolder {
    ImageView imageView;
    TextView title;

}
于 2018-08-09T08:48:25.080 に答える