2013-11-21 34 views
5

当我尝试修复我的listView项目的位置到期望的意图过滤时,并获得信息我可以重写使用自定义适配器的问题,我已经做到了,但我没有知道如何分配点击到每个项目,请检查以下代码:设置onItemClick到自定义适配器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 

} 
} 

我将不胜感激任何帮助。感谢Yhu!

编辑

这项工作?

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); 
+0

指派点击每个项目?你能详细说明吗? – Raghunandan

+0

是的,就像我以前使用过simple_list_layout,它没有getItem,getCount参数一样,所以它非常简单,现在在使用这个参数的自定义适配器的情况下,我很困惑它要采取什么步骤。 –

+0

在onItemClick方法下写一个toast。您已经分配了点击监听器,但您没有像我看到的那样使用它的回调。并且请在getView方法中重用您的视图。 – Devrim

回答

8

编辑中的全部

我刚收到你需要什么,我添加了一个过滤器,你baseAdapter,然后在内部editText你的文字变化过滤listView,然后您转到所需的活动。

这里是完整的代码,但是你需要记住裸露,我已经改变了以下内容:

  • 我改变了分页到的ArrayList,而不是
  • 没有在过滤中的错误,当我抹去我在EditText中写的它不会更新ListView,你需要弄清楚为什么。
  • 我从对象改变了功能getItem(int i)的返回值的字符串
  • 在你要搜索的名称,而不是位置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(); 
} 
} 
+0

Cordeji!如果我使用上面的代码,那么这个位置会不会像我们在应用过滤器时所做的以前的简单布局一样混乱? –

+0

请检查它 – Coderji

+0

是的,你让我正确...关于ListView没有更新,快速搜索给了这个 - 在过滤器完成后在列表中明确地设置适配器对象。我怎么把这个老板? –

1

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

感谢您的提示,Coderji给出的回应,有点作品,除了当点击backspace或当打开intent并返回后ListView不更新时,列表不会被更新,ListView不会更新,您能检查他代码和可能的帮助,请吗?谢谢。 –

相关问题