2016-04-23 122 views
0

我有一个自定义BaseAdapter为我的ListView其中我实现AdapterView.OnItemClickListenerBaseAdapter OnItemClickListener从未呼吁

问题是onItemClick(AdapterView<?>, View, int, long)方法永远不会被调用。我想我需要在我的主Activity中实现interface,而不是在我的ListView自定义适配器中。

MyListViewAdapter.java

public class MyListViewAdapter extends BaseAdapter implements AdapterView.OnItemClickListener 
{ 
    private Context context; 
    private ArrayList<MyListViewRow> rowsList = new ArrayList<MyListViewRow>(); // All one row items 

    private TextView a; 


    public MyListViewAdapter(Context context,ArrayList<MyListViewRow> rowsList) 
    { 
     this.context = context; 
     this.rowsList = rowsList; 
    } 

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

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

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

    /** 
    * Returns a new row to display in the list view. 
    * 
    * Position - position of the current row. 
    * 
    */ 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     LayoutInflater layoutInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     /** 
     * Inflating the root view and all his children and set them to a View Object. 
     * 
     */ 
     View row = layoutInflater.inflate(R.layout.list_view_row,null); 

     // Get all the views in my row 
     this.a = (TextView) row.findViewById(R.id.a_id; 


     MyListViewRow myListViewRow = rowsList.get(position); 

     // Set values to all the views in my row 
     this.a.setText(myListViewRow.getA()); 



     return row; 
    } 


    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    { 
     Toast.makeText(context, "onItemClick LV Adapter called", Toast.LENGTH_LONG).show(); 

    } 


} // End of MyListViewAdapter class 

我说得对不对?

+0

您是否在任何地方调用listView.setOnItemClickListener?没有这个,它不会被调用。 –

+0

@GabeSechan不,因为我在'BaseAdapter'类中实现'interface'。 – God

+0

这并不意味着什么。你必须调用setOnItemClickListener,否则它将永远不会被调用。 –

回答

2

为什么你会在适配器中有一个OnItemClickListener?要么在适配器内部有OnClickListener,要么最好的做法是将OnItemClickListener设置为ListView或您在活动/片段中使用的任何AdapterView。 你现在这样做的方式,它不会有几个原因:

  1. 您不设置侦听器视图。
  2. CAN NOT将OnItemClickListener设置为TextView。
  3. 将onClickListener设置为适配器类中的TextView意味着您将不得不单击TextView本身,否则将会调用侦听器不会调用
+0

如果我不能将'OnItemClickListener'设置为'TextView',那么我将简单地使用'OnClickListener'。我对吗? – God

+0

是的,但我建议你在ListView上使用OnItemClickListener。例如: ListView mListView =(ListView)findViewById(R.id.myListView); mListView.setOnItemClickListener(新AdapterView.OnItemClickListener(){ @覆盖 公共无效onItemClick(适配器视图父,观景,INT位置,长 //实现任何你需要做 } }; – ErenisR

+0

像什么?如果它不适用于'TextView'这对我毫无价值 – God

1

使用自定义适配器OnItemClickListener不起作用。您必须在getView方法中的view上注册onClickListener。

public View getView(int position, View convertView, ViewGroup parent) 
    { 
     LayoutInflater layoutInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     /** 
     * Inflating the root view and all his children and set them to a View Object. 
     * 
     */ 
     View row = layoutInflater.inflate(R.layout.list_view_row,null); 

     // Get all the views in my row 
     this.a = (TextView) row.findViewById(R.id.a_id; 


     MyListViewRow myListViewRow = rowsList.get(position); 

     // Set values to all the views in my row 
     this.a.setText(myListViewRow.getA()); 
     row.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      // do your stuff 
     } 
    }); 


     return row; 
    } 
+0

为什么它不适用于自定义适配器?我没有在文档中看到任何符号。 – God

+0

是的,它在android文档中没有提及。点击事件发生冲突。所以OnIemClickListener不起作用。你可以尝试一个技巧来禁用android:focusableInTouchMode =“false” android:clickable =“false” android:focusable =“false”在行的所有子视图中 – USKMobility

+0

好的,谢谢。 – God