Java 将onItemClick设置为自定义适配器ListView

Java 将onItemClick设置为自定义适配器ListView,java,android,listview,android-listview,Java,Android,Listview,Android Listview,当我在尝试将listView项目的位置固定到过滤时所需的位置时遇到问题,并且获得信息时,我可以使用自定义适配器覆盖该问题,我已经这样做了,但我不知道如何将单击分配给每个项目,请检查以下代码: public class IndexPageActivity extends Activity { ListView listView; EditText editTextB; @Override protected void onCreate(Bundle savfedInstanceState) {

当我在尝试将listView项目的位置固定到过滤时所需的位置时遇到问题,并且获得信息时,我可以使用自定义适配器覆盖该问题,我已经这样做了,但我不知道如何将单击分配给每个项目,请检查以下代码:

public class IndexPageActivity extends Activity { 
ListView listView;
EditText editTextB;

@Override
protected void onCreate(Bundle savfedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.indexpage);
    listView = (ListView) findViewById(R.id.pageList);
    editTextB = (EditText) findViewById(R.id.searchB);
    listView.setAdapter(new PagesAdapter(this));
    listView.setOnItemClickListener((OnItemClickListener) this);

}
}
class SingleRow {
String pagedata;
SingleRow(String pagedata){
    this.pagedata=pagedata;
}
}
class PagesAdapter extends BaseAdapter implements OnItemClickListener{
ArrayList<SingleRow> pagelist;
Context context;

PagesAdapter(Context c){
    context=c;
    pagelist = new ArrayList<SingleRow>();
    Resources res = c.getResources();
    String [] pagedatas = res.getStringArray(R.array.pages_data);
    for (int i=0;i<463;i++){
        pagelist.add(new SingleRow(pagedatas[i]));
    }
}
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return pagelist.size();
}

@Override
public Object getItem(int i) {
    // TODO Auto-generated method stub
    return pagelist.get(i);
}

@Override
public long getItemId(int i) {
    // TODO Auto-generated method stub
    return i;
}

@Override
public View getView(int i, View view, ViewGroup viewG) {
    // TODO Auto-generated method stub
    LayoutInflater inflater=(LayoutInflater)             context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View row=inflater.inflate(R.layout.single_row,viewG,false);
    TextView pagetitle = (TextView) row.findViewById(R.id.textViewRow);

    SingleRow temp=pagelist.get(i);

    pagetitle.setText(temp.pagedata);
    return row;
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int i, long arg3) {
    // TODO Auto-generated method stub

}
}

将您的
setOnItemClickListenerlike设置如下:

@Override
protected void onCreate(Bundle savfedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.indexpage);
    listView = (ListView) findViewById(R.id.pageList);
    editTextB = (EditText) findViewById(R.id.searchB);
    listView.setAdapter(new PagesAdapter(this));
    listView.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
        //Your code here
        //int position is the index of the list item you clicked    
        //use it to manipulate the item for each click      
    }
});
}
@覆盖
创建时受保护的void(Bundle savfedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.indexpage);
listView=(listView)findViewById(R.id.pageList);
editTextB=(EditText)findViewById(R.id.searchB);
setAdapter(新页面适配器(this));
setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
//你的代码在这里
//int position是您单击的列表项的索引
//使用它为每次单击操作项目
}
});
}

全部编辑

我刚刚得到您需要的,我在
baseAdapter
中添加了一个过滤器,然后在
editText
中的文本更改中过滤
列表视图
,然后转到所需的活动

以下是完整的代码,但您需要记住,我已更改了以下内容:

  • 我将页面列表改为ArrayList,而不是
  • 过滤中有一个错误,当我删除我在
    EditText
    中写的内容时,它不会更新列表视图,您需要找出原因
  • 我将函数
    getItem(inti)
    的返回值从Object更改为String
  • onItemClick
    中,您必须搜索名称而不是位置
代码如下:

public class IndexPageActivity extends Activity implements OnItemClickListener{ 
ListView listView;
EditText editTextB;
PagesAdapter adapter1;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
            listView = (ListView) findViewById(R.id.pageList);
            editTextB = (EditText) findViewById(R.id.searchB);
            adapter1 = new PagesAdapter(this);
            listView.setAdapter(adapter1);
            adapter1.notifyDataSetChanged();
            listView.setOnItemClickListener(this);

            editTextB.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence cs, int arg1, int arg2,
                        int arg3) {
                    // When user changed the Text
                    IndexPageActivity.this.adapter1.getFilter().filter(cs.toString());
                    adapter1.notifyDataSetChanged();
                }

                @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
                }
            });
    }


@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
    // TODO Auto-generated method stub
    Intent i;
    String name = adapter1.getItem(position);
            Log.d("id", name);
    if (name.equals("Item1"))
    {
        i = new Intent(this, anActivity.class);
        startActivity(i);
    }
    else if (name.equals("Item2"))
    {
        i = new Intent(this, anActivity2.class);
        startActivity(i);
    }
}
}


class SingleRow {
String pagedata;
SingleRow(String pagedata){
    this.pagedata=pagedata;
}
}
class PagesAdapter extends BaseAdapter implements Filterable{
ArrayList<String> pagelist;
List<String> arrayList;
Context context;
String [] pagedatas;

PagesAdapter(Context c){
    context=c;
    pagelist = new ArrayList<String>();
    Resources res = c.getResources();
    pagedatas = res.getStringArray(R.array.pages_data);
    for (int i=0;i<463;i++){
        pagelist.add(pagedatas[i]);
    }
}
@Override
public int getCount() {
    // TODO Auto-generated method stub
    return pagelist.size();
}

@Override
public String getItem(int i) {
    // TODO Auto-generated method stub
    return pagelist.get(i);
}

@Override
public long getItemId(int i) {
    // TODO Auto-generated method stub
    return i;
}


@Override
public View getView(int i, View view, ViewGroup viewG) {
    // TODO Auto-generated method stub
    LayoutInflater inflater=(LayoutInflater)             context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View row=inflater.inflate(R.layout.single_row,viewG,false);
    TextView pagetitle = (TextView) row.findViewById(R.id.textViewRow);

    String temp=pagelist.get(i);

    pagetitle.setText(temp);
    return row;
}

public class filter_here extends Filter{

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        // TODO Auto-generated method stub

        FilterResults Result = new FilterResults();
        // if constraint is empty return the original names
        if(constraint.length() == 0 ){
            Result.values = pagelist;
            Result.count = pagelist.size();
            return Result;
        }

        ArrayList<String> Filtered_Names = new ArrayList<String>();
        String filterString = constraint.toString().toLowerCase();
        String filterableString;

        for(int i = 0; i<pagelist.size(); i++){
            filterableString = pagelist.get(i);
            if(filterableString.toLowerCase().contains(filterString)){
                Filtered_Names.add(filterableString);
            }
        }
        Result.values = Filtered_Names;
        Result.count = Filtered_Names.size();

        return Result;
    }

    @Override
    protected void publishResults(CharSequence constraint,FilterResults results) {
        // TODO Auto-generated method stub
        pagelist = (ArrayList<String>) results.values;
        notifyDataSetChanged();
    }

}

@Override
public Filter getFilter() {
    // TODO Auto-generated method stub

    return new filter_here();
}
}
公共类IndexPageActivity扩展活动实现OnItemClickListener{
列表视图列表视图;
编辑文本编辑文本b;
页面适配器1;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(listView)findViewById(R.id.pageList);
editTextB=(EditText)findViewById(R.id.searchB);
适配器1=新页面适配器(本);
setAdapter(适配器1);
adapter1.notifyDataSetChanged();
setOnItemClickListener(this);
editTextB.addTextChangedListener(新的TextWatcher(){
@凌驾
public void onTextChanged(字符序列cs、int arg1、int arg2、,
int arg3){
//当用户更改文本时
IndexPageActivity.this.adapter1.getFilter().filter(cs.toString());
adapter1.notifyDataSetChanged();
}
@凌驾
更改前的公共无效(字符序列arg0,int arg1,
整数arg2,整数arg3){
//TODO自动生成的方法存根
}
@凌驾
public void PostTextChanged(可编辑arg0){
//TODO自动生成的方法存根
}
});
}
@凌驾
public void onItemClick(AdapterView arg0,视图v,内部位置,长arg3){
//TODO自动生成的方法存根
意图一;
String name=adapter1.getItem(位置);
Log.d(“id”,名称);
如果(名称等于(“项目1”))
{
i=新意图(这是一个activity.class);
星触觉(i);
}
如果(名称等于(“项目2”))
{
i=新的意图(此为活动2.class);
星触觉(i);
}
}
}
类单列{
字符串页面数据;
单行(字符串页面数据){
this.pagedata=pagedata;
}
}
类PagesAdapter扩展BaseAdapter实现可过滤{
ArrayList页面列表;
列表数组列表;
语境;
字符串[]页数据;
PagesAdapter(上下文c){
上下文=c;
pagelist=新的ArrayList();
Resources res=c.getResources();
pagedatas=res.getStringArray(R.array.pages\u数据);

对于(int i=0;i它有两种不同的方式:

1)如果您想在创建活动时使用类似的内容

listView.setOnItemClickListener((OnItemClickListener)this);

您应该对您的活动实施
OnItemClickListener

IndexPageActivity extends Activity implements OnItemClickListener
并在活动中实现其onItemClick方法。(同时从自定义适配器中删除
OnItemClickListener
接口)

2)您可以简单地使用以下内容,而无需对任何类实现
OnItemClickListener

listView.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // TODO: handle row clicks here
    }

为每个项目分配单击?你能详细说明一下吗?是的,就像我以前使用的简单列表布局一样,它没有getItem、getCount参数,因此非常简单,现在对于带有此参数的自定义适配器,我不知道该执行哪一步。在onItemClick方法下编写一个toast。你已经分配了单击但是您没有使用它的回调,正如我所看到的。另外,请在getView方法中重用您的视图。@OluleyeIResþektIdowu单击列表行中的textview?我希望ListView的每一项都能够打开一个新的意图,我通过上面使用简单布局的编辑实现了这一点,但是当我对这个简单布局应用过滤方法时,它会出错这就是我为什么选择customAdapter的原因。我希望我说的有道理?Cordeji!如果我使用上面的代码,位置不会像我们在应用过滤器时所做的简单布局那样弄乱吗?是的,你说得对……关于ListView没有更新,quick search给列表中的这个-set adapter对象一个明确的定义过滤完成后。我如何放置此boss?在上面的代码中,您可以根据
EditText
过滤列表,当您过滤列表并按下该项时,列表将显示
listView.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // TODO: handle row clicks here
    }
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    if (convertView == null) {
        LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.single_row, parent, false);
    } else {
        view = convertView;
    }

    TextView pagetitle = (TextView) view.findViewById(R.id.textViewRow);

    SingleRow temp=pagelist.get(i);

    pagetitle.setText(temp.pagedata);
    return view;
}