2016-08-03 25 views
2

這裏是我的MainActivity.java我在item.here上定義onclicklistener總是我得到過濾後的項目錯誤的值,如果在列表視圖中有10個項目然後過濾後,如果我得到3項和正確的位置是像3,6,9,但我得到0,1,2。
過濾器listView後我無法得到物品的實際位置android

請幫幫我。

package com.focusmedica.maadiabetes; 

import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.WindowManager; 
import android.widget.AdapterView; 
import android.widget.EditText; 
import android.widget.ListView; 

import java.util.ArrayList; 

public class MainActivity extends Activity { 

private MainAdapter adapter; 
private static ListView lvFiltered; 
private static ArrayList<DataModel> data=new ArrayList<>();; 
MyDatabase handler; 
private EditText etSearch; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    lvFiltered =(ListView)findViewById(R.id.lvFiltered); 
    etSearch = (EditText)findViewById(R.id.etSearch); 
    etSearch.setText(""); 
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 

    handler=new MyDatabase(this); 

    data=handler.getChapterDetails(); 
    adapter = new MainAdapter(this,data); 
    lvFiltered.setAdapter(adapter); 
    lvFiltered.setTextFilterEnabled(true); 

    lvFiltered.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Intent intent = new Intent(MainActivity.this, SubActivity.class); 
      intent.putExtra("position", position); 
      startActivity(intent); 
     } 
    }); 

    etSearch.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
      if(cs.length()>0) { 
       etSearch.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.delete, 0); 
      }else{ 
       etSearch.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); 
      } 
      // When user changed the Text 
      adapter.getFilter().filter(cs); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub 
     } 
    }); 

    etSearch.setOnTouchListener(new View.OnTouchListener() { 
     @SuppressLint("ClickableViewAccessibility") 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if(event.getAction() == MotionEvent.ACTION_UP) { 
       if(etSearch.getCompoundDrawables()[2]!=null){ 
        if(event.getX() >= (etSearch.getRight()- etSearch.getLeft() - etSearch.getCompoundDrawables()[2].getBounds().width())) { 
         etSearch.setText(""); 
        } 
       } 
      } 
      return false; 
     } 
    }); 
    } 
} 

這裏是適配器類

package com.focusmedica.maadiabetes; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.Filter; 
import android.widget.Filterable; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.util.ArrayList; 

/** 
* Created by windev on 8/2/2016. 
*/ 

public class MainAdapter extends BaseAdapter implements Filterable { 

ArrayList<DataModel> dataSet; 
Context context; 
DataModel content; 
public ArrayList<DataModel> orig; 

public MainAdapter(Context context, ArrayList dataSet) { 
    super(); 
    this.context = context; 
    this.dataSet = dataSet; 
} 


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

@Override 
public Object getItem(int position) { 
    return dataSet.get(position); 
} 

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

class ViewHolder { 
    private TextView tvChapterName; 
    private ImageView ivChapterIcon; 
} 

@Override 
public View getView(int position, View view, ViewGroup viewGroup) { 
    final ViewHolder viewHolder; 
    if (view == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.card_layout, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.tvChapterName = (TextView) view.findViewById(R.id.tvChapterName); 
     viewHolder.ivChapterIcon=(ImageView)view.findViewById(R.id.ivChapterIcon); 
     view.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) view.getTag(); 
    } 
    content = dataSet.get(position); 
    viewHolder.tvChapterName.setText(content.getChapterName()); 
    viewHolder.ivChapterIcon.setImageResource(R.drawable.caticon); 
    return view; 
} 

public Filter getFilter() { 
    return new Filter() { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      final FilterResults oReturn = new FilterResults(); 
      final ArrayList<DataModel> results = new ArrayList<>(); 
      final ArrayList<DataModel> ids = new ArrayList<>(); 
      if (orig == null) 
       orig = dataSet; 
      if (constraint != null) { 
       if (orig != null && orig.size() > 0) { 
        for (final DataModel g : orig) { 
         if (g.getChapterName().toLowerCase().contains(constraint.toString())|| 
           g.getChapterName().toUpperCase().contains(constraint.toString())) 
          results.add(g); 
        } 
       } 
       oReturn.values = results; 
      } 
      return oReturn; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, 
             FilterResults results) { 
      dataSet = (ArrayList<DataModel>) results.values; 
      notifyDataSetChanged(); 
     } 
    }; 
} 

public void notifyDataSetChanged() { 
    super.notifyDataSetChanged(); 
} 
} 
+0

而不是位置嘗試獲取數據集的id並將其傳遞 – Vickyexpert

+0

使用[this](https://gist.github.com/pskink/2dd4d17a93caf02ff696533e82f952b0)通用適配器而不是創建自定義'BaseAdapter' +自定義'Filter' – pskink

回答

2

爲了讓「舊」的位置(這相當於該項目ID)在過濾列表中的項目:

@Override 
public long getItemId(int position) { 

    int itemID; 

    // orig will be null only if we haven't filtered yet: 
    if (orig == null) 
    { 
     itemID = position; 
    } 
    else 
    { 
     itemID = orig.indexOf(dataSet.get(position)); 
    } 
    return itemID; 
} 

現在使用這種方法與OnItemClickListener

@Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Intent intent = new Intent(MainActivity.this, SubActivity.class); 
     intent.putExtra("position", adapter.getItemId(position)); 
     startActivity(intent); 
    } 

注意:如果您需要使用notifyDatasetChanged(),則最好覆蓋此方法:

@Override 
public void notifyDatasetChanged() 
{ 
    // either this or: orig = dataSet; 
    orig = null; 
    super.notifyDatasetChanged(); 
} 
+0

謝謝@ 0XOnosugar它適合我。 –

+0

非常感謝它爲我工作 –

0

濾波 '的ArrayList' 將從第0位置添加數據之後。所以你會得到位置爲0,1,2。你必須使用id而不是位置。

0

將想要獲取的數據存儲在數組中,並通過用戶使用listview的onClick方法中相同數組中的位置來選擇數據。

相關問題