【问题标题】:Set onItemClick to Custom adapter ListView将 onItemClick 设置为自定义适配器 ListView
【发布时间】:2013-11-21 17:30:25
【问题描述】:

当我在尝试将我的 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

}
}

我将感谢您提供的任何帮助。谢谢你!

编辑

这行得通吗?

 if (index == 0) {
    Intent i = new Intent(this, WebViewActivity.class);
    i.putExtra("keyHTML", "file:///android_asset/page1.html");
    startActivity(i);
} else if (index == 1) {
    Intent i = new Intent(this, WebViewActivity.class);
    i.putExtra("keyHTML", "file:///android_asset/page2.html");
    startActivity(i);

【问题讨论】:

  • 将点击分配给每个项目?能详细点吗?
  • 是的,就像我之前使用的 simple_list_layout 一样,它没有 getItem、getCount 参数,所以它非常简单,现在对于具有此参数的自定义适配器,我很困惑采取什么步骤。
  • 在onItemClick方法下写一个toast。您已经分配了点击侦听器,但正如我所见,您没有使用它的回调。并且请在 getView 方法中重用您的视图。
  • @OluleyeIResþektIdowu 单击列表行中的文本视图?
  • 我希望 ListView 的每个项目都能够打开一个新的意图,我通过上面的 EDIT 使用简单布局实现了这一点,但是当我将过滤方法应用于这个简单布局时,它会混乱提高意图。这就是我选择customAdapter的原因。我希望我说得通?

标签: java android listview android-listview


【解决方案1】:

已全部编辑

我刚刚得到了您需要的内容,我在您的baseAdapter 中添加了一个过滤器,然后在editText 中的文本更改您过滤了listView,然后您转到所需的活动。

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

  • 我将 pageList 更改为 ArrayList 而不是
  • 过滤中有一个错误,当我删除我在EditText 中写的内容时,它不会更新 ListView,您需要找出原因。
  • 我将函数getItem(int i)的返回值从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();
}
}

【讨论】:

  • 科德吉!如果我使用上面的代码,位置会不会像我们之前在应用过滤器时所做的简单布局一样混乱?
  • 是的,你说得对...关于 ListView 没有更新,快速搜索给出了这个 - 在过滤器完成后显式地在列表中设置适配器对象。这个boss怎么放?
  • 在上面的代码中,您可以根据EditText 过滤列表,当您过滤它并按下项目时,它将带您到正确的位置!事情是getItem 返回一个对象或字符串。我不知道在 obj 中该做什么,但是,使用字符串,您可以在 if 语句中使用它来将您带到所需的活动。检查onItemClick 而不是item1 将其更改为R.id.pages_data 中的项目名称。
  • @Cordeji,我了解你,当我粘贴上面的第三条评论时一切正常,当我使用字符串并输入页面标题的全名时它工作正常。它只是在从 iTem 活动切换回来时单击退格键时更新 listView。非常感谢!我想弄清楚的唯一问题是列表视图的更新。请检查这个谢谢 - stackoverflow.com/questions/11840344/… 如果你能理解的话。我觉得自己很笨。
  • 哈哈哈哈终于做到了。请检查最终编辑希望您的问题得到解决。我将答案添加到您的qeustion:)
【解决方案2】:

两种不同的方式:

1)如果你想在你的活动的 onCreate 中使用这样的东西;

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
    }

我建议第二个选项。这更容易。

编辑:这与您的问题无关,但您应该在 listView 重用您的视图/行。将您的 getView 方法更改为:

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

【讨论】:

  • 感谢您的提示,Coderji 给出的响应,有点工作,当然除了当单击退格键或打开意图并返回后列表没有更新的事实,ListView不更新,你能检查他的代码,也许能帮忙吗?谢谢。
【解决方案3】:

设置你的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      
    }
});
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多