ListView筛选错误的结果

时间:2014-03-22 12:52:27

标签: java android android-listview

这是一个常见问题,但已解决的问题并不适用于我的代码,因此我认为我会粘贴自己的代码,因为我注意到有一百万种方法可以通过Android开发实现相同的结果有点难,但无论如何...

每当我过滤我的列表视图时,在过滤器之后不会保持列表视图项的位置,过滤的项目被分配一个从0开始的新位置,因此用新的文件项替换位置0上的原始列表视图项。那个位置。

例如:listview = aONE [0], aTWO [1], aTHERE[2], bONE [3], b TWO[4], bTHREE [5].

如果我输入“b”,则新列表为

bONE [0], bTWO [1], bTHREE [2] and NOT bONE [3], bTWO [4], bTHREE [5],

下面是我的代码:

public class ListViewAdapterProduct extends BaseAdapter {

    // Declare Variables
    Context mContext;
    LayoutInflater inflater;
    private List<ClassProductList> classProductlist = null;
    private ArrayList<ClassProductList> arraylist;

    public ListViewAdapterProduct(Context context, List<ClassProductList> classProductlist) {
        mContext = context;
        this.classProductlist = classProductlist;
        inflater = LayoutInflater.from(mContext);
        this.arraylist = new ArrayList<ClassProductList>();
        this.arraylist.addAll(classProductlist);
    }

    public class ViewHolder {        
        TextView title;
        TextView description;
        ImageView photo;
    }

    @Override
    public int getCount() {
        return classProductlist.size();
    }

    @Override
    public ClassProductList getItem(int position) {
        return classProductlist.get(position);
    }

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

    public View getView(final int position, View view, ViewGroup parent) {
        final ViewHolder holder;
        if (view == null) {
            holder = new ViewHolder();
            view = inflater.inflate(R.layout.list_view_single_row, null);
            holder.title = (TextView) view.findViewById(R.id.textLarge);
            holder.description = (TextView) view.findViewById(R.id.textSmall);
            holder.photo= (ImageView) view.findViewById(R.id.imageThumb);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }
        holder.title.setText(classProductlist.get(position).getTitle());
        holder.description.setText(classProductlist.get(position).getDescription());
        holder.photo.setImageResource(classProductlist.get(position).getImage());

        view.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {

                if(position == 0) {
                    Intent intent0 = new Intent(mContext, ProductMyactivity1.class);
                    mContext.startActivity(intent0);
                }

                if(position == 1) {
                    Intent intent1 = new Intent(mContext, ProductMyactivity2.class);
                    mContext.startActivity(intent1);
                }
            }        
        });

        return view;
    }

    // Filter Class
    public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        classProductlist.clear();
        if (charText.length() == 0) {
            classProductlist.addAll(arraylist);
        }
        else
        {
            for (ClassProductList Product : arraylist)
            {
                if (Product.getTitle().toLowerCase(Locale.getDefault()).contains(charText))
                {
                    classProductlist.add(Product);
                }
            }
        }

        notifyDataSetChanged();
    }

}

由于

4 个答案:

答案 0 :(得分:1)

以下代码解决了我的ListViewAdapter

中的问题
// Listen for ListView Item Click
        view.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            // Send single item click data to SingleItemView Class
            String mytitle=holder.listContent.getText().toString();

            if(mytitle.equals("murakoze")) {

                // Play song

                mp.reset();// stops any current playing song
                mp = MediaPlayer.create(mContext, R.raw.murakoze);// create's
// new
// mediaplayer

// with
   // song.
                mp.start(); // starting mediaplayer

            }
        }
    });
    return view;
   }

答案 1 :(得分:0)

最简单的方法是使用另一个itemId,但在

中定位
@Override
public long getItemId(int position) {
    return position;
}

通过过滤原始项目,移动到&#34; originalValues列表&#34;,将创建一个新列表,并将刚过滤的项目放入其中并显示。所有对getItem(int pos)和其他许多人的进一步调用随后都会使用已过滤的列表。这个位置会改变。您可以实现自己的ListView,也可以只使用其他ID。

要在getItemId(int pos)调用ClassProductList getItem(int position)中执行此操作以获取您的对象。从ClassProductList检索您的标识符并使​​用该标识符。

答案 2 :(得分:0)

已解决!!!!!

view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {

String mytitle=holder.title.getText().toString();

if(mytitle.equals("ProductOne")){
    Intent intent1 = new Intent(mContext, ProductClass.ProductOne);
    mContext.startActivity(intent1);
    ...        
}

}

不得不补充:

String mytitle=holder.title.getText().toString();

并使用字符串和NOT位置,因此无论是否应用了天气过滤器,都会始终使用列表视图项字符串,无论过滤后它采用哪个新位置。

答案 3 :(得分:0)

由于已经将适配器设置为列表视图,因此存在获取项目当前位置的问题,因此必须首先清除其内容然后再调用它们

                lv.setAdapter( null );
                myData( );//contains your data
                ca.notifyDataSetChanged();//notifying the change

我认为这会为您提供帮助