0

に問題がありますListView。私はそれらをいくつかのプロジェクトで使用していますが、それらのすべてでエラーが発生します。

ある場合には、すべての項目に固有の画像があり、別の場合には、太字のテキストを含む項目と含まない項目があります。

画像/太字のテキストをスクロールすると正しい位置に表示されず、ある時点ですばやく上下にスクロールすると(bの場合)、ほぼすべての項目が太字になります。

私が見つけた唯一の投稿はこれでしたが、問題は解決しませんでした。

これが私のカスタムアダプターです:

private class MyAdapter extends BaseAdapter {

    private List<Object> obj;
    private LayoutInflater inflater;

    public MyAdapter(Context context, List<Object> obj_list) {
        this.obj_list = obj_list;
        this.inflater = LayoutInflater.from(context);
    }

    public int getCount(){
        return this.obj_list.size();
    }

    public Object getItem(int position){
        return this.obj_list.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if(convertView == null){
            convertView = inflater.inflate(R.layout.my_row_layout, null);
            holder = new ViewHolder();
            holder.item_one = (TextView)convertView.findViewById(R.id.txtItemOne);
            holder.item_two = (TextView)convertView.findViewById(R.id.txtItemTwo);

            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        Object objectItem = getItem(position);

        //here I set the boldness
        if(condition) {
            holder.item_one.setTypeface(null, Typeface.BOLD);
        }

        holder.item_one.setText(objectItem .getItemOne());
        holder.item_two.setText(objectItem .getItemTwo());            

        return convertView;
    }

    class ViewHolder {
        TextView hItemOne;
        TextView hItemTwo;          
    }
}

私が間違っているかもしれないことを誰かが考えていますか? または、少なくとも同じ問題を経験しましたか?

ありがとう!

4

3 に答える 3

2

問題は、ViewHolder パターンを使用しているためです。ビュー ホルダー パターン android では、既存のビューを再利用しています。そのため、以前に生成された太字のビューを再利用している場合。ビューをレンダリングしようとして、適用した条件を満たさない場合は、以前のボールド体をレンダリングするだけです。したがって、次の方法で問題を解決できます。

holder.item_one.setTypeface(null, Typeface.NORMAL);
//here I set the boldness
if(condition) {
      holder.item_one.setTypeface(null, Typeface.BOLD);
}
于 2013-07-30T07:32:16.820 に答える
0

定義済みの特定の位置で太字にする必要がある場合は、次のようにします。

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if(convertView == null){
            convertView = inflater.inflate(R.layout.my_row_layout, null);
            holder = new ViewHolder();
            holder.item_one = (TextView)convertView.findViewById(R.id.txtItemOne);
            holder.item_two = (TextView)convertView.findViewById(R.id.txtItemTwo);

            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        Object objectItem = getItem(position);


        if(position==2 || position==5) {
            holder.item_one.setTypeface(null, Typeface.BOLD);
            holder.item_one.setText(objectItem .getItemOne());
        }
        else
         holder.item_two.setText(objectItem .getItemTwo());            

        return convertView;
    }

ただし、「else」を削除すると機能しないことに注意してください。

于 2013-07-30T07:36:59.433 に答える