Java 将onItemClick设置为自定义适配器ListView
当我在尝试将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) {
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;
}