设置onClickListener多的TextView在一个ListView

问题描述:

我已经建立了从数据看起来像这样设置onClickListener多的TextView在一个ListView

data = {{"cat1","cat2","cat3","cat4"}, 
         {"dog1","dog2","dog3"}, 
         {"lion1"}, 
         {"monkey1","monkey2"}}; 

ArrayList<ArrayList<String>>称为数据ListView的多行,我已经将它设置这样的:

public static final String[] weekdayStringArray = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}; 

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ArrayList<String> stringArrayList = data.get(position); 
     String dayString = weekdayStringArray[dayNumber]; 

     switch(stringArrayList.size()){ 
      case 4: 
       convertView = mLayoutInflater.inflate(R.layout.four_meal_item_view, parent, false); 
       TextView mealOne_Four = (TextView) convertView.findViewById(R.id.firstMealTextView); 
       TextView mealTwo_Four = (TextView) convertView.findViewById(R.id.secondMealTextView); 
       TextView mealThree_Four = (TextView) convertView.findViewById(R.id.thirdMealTextView); 
       TextView mealFour_Four = (TextView) convertView.findViewById(R.id.fourthMealTextView); 
       TextView dayText_Four = (TextView) convertView.findViewById(R.id.dayTextView); 
       dayText_Four.setText(dayString); 
       mealOne_Four.setText(stringArrayList.get(0).substring(0,1).toUpperCase() + stringArrayList.get(0).substring(1).toLowerCase()); 
       mealTwo_Four.setText(stringArrayList.get(1).substring(0,1).toUpperCase() + stringArrayList.get(1).substring(1).toLowerCase()); 
       mealThree_Four.setText(stringArrayList.get(2).substring(0,1).toUpperCase() + stringArrayList.get(2).substring(1).toLowerCase()); 
       mealFour_Four.setText(stringArrayList.get(3).substring(0,1).toUpperCase() + stringArrayList.get(3).substring(1).toLowerCase()); 
       break; 
      case 3: 
       convertView = mLayoutInflater.inflate(R.layout.three_meal_item_view, parent, false); 
       TextView mealOne_Three = (TextView) convertView.findViewById(R.id.firstMealTextView_Three); 
       TextView mealTwo_Three = (TextView) convertView.findViewById(R.id.secondMealTextView_Three); 
       TextView mealThree_Three = (TextView) convertView.findViewById(R.id.thirdMealTextView_Three); 
       TextView dayText_Three = (TextView) convertView.findViewById(R.id.dayTextView_Three); 
       dayText_Three.setText(dayString); 
       mealOne_Three.setText(stringArrayList.get(0).substring(0,1).toUpperCase() + stringArrayList.get(0).substring(1).toLowerCase()); 
       mealTwo_Three.setText(stringArrayList.get(1).substring(0,1).toUpperCase() + stringArrayList.get(1).substring(1).toLowerCase()); 
       mealThree_Three.setText(stringArrayList.get(2).substring(0,1).toUpperCase() + stringArrayList.get(2).substring(1).toLowerCase()); 
       break; 
      case 2: 
       convertView = mLayoutInflater.inflate(R.layout.two_meal_item_view, parent, false); 
       TextView mealOne_Two = (TextView) convertView.findViewById(R.id.firstMealTextView_Two); 
       TextView mealTwo_Two = (TextView) convertView.findViewById(R.id.secondMealTextView_Two); 
       TextView dayText_Two = (TextView) convertView.findViewById(R.id.dayTextView_Two); 
       dayText_Two.setText(dayString); 
       mealOne_Two.setText(stringArrayList.get(0).substring(0,1).toUpperCase() + stringArrayList.get(0).substring(1).toLowerCase()); 
       mealTwo_Two.setText(stringArrayList.get(1).substring(0,1).toUpperCase() + stringArrayList.get(1).substring(1).toLowerCase()); 
       break; 
      case 1: 
       convertView = mLayoutInflater.inflate(R.layout.one_meal_item_view, parent, false); 
       TextView mealOne_One = (TextView) convertView.findViewById(R.id.firstMealTextView_One); 
       TextView dayText_One = (TextView) convertView.findViewById(R.id.dayTextView_One); 
       dayText_One.setText(dayString); 
       mealOne_One.setText(stringArrayList.get(0).substring(0,1).toUpperCase() + stringArrayList.get(0).substring(1).toLowerCase()); 
       break; 
      case 0: 
       convertView = mLayoutInflater.inflate(R.layout.zero_meal_item_view, parent, false); 
       TextView dayText_Zero = (TextView) convertView.findViewById(R.id.dayTextView_Zero); 
       dayText_Zero.setText(dayString + "(Closed)"); 
       break; 
     } 
return convertView; 

现在我想添加一个onClickListener,以便我可以连续点击TextView。当点击此TextView时,我移动到一个新的Activity,传递被点击的TextView的文本以及与点击的TextView位于同一行的dayTextView的文本。

现在我不想设定一堆onClickListners每个TextView究竟什么是做这行的所有TextView在我ListView的行的高效方式?

选项1:

在XML每个TextView的设置的onClick的相同方法

android:onClick= "itemtapped" 

然后在您的活动中点击通话项目,让它获取textview名称和位置编号,以便您知道哪一个被点击。

选项2:

请在采取该被窃听

像这样的事情

 public void setOnClickListener(TextView... arrayOfView, int position){ 

    TextView[] ]textViewArray = textViewArray; 

    for(int i = 0 ; i < textViewArray.length ; ++i){ 

     int index = i; 
     textViewArray[i].setOnClickListener(new OnClickListener(){ 

       @Override 
       public void onClick(View v){ 
        Intent intent = new Intent(MainActivity.this, YourTargetActivity.class); 
        startActivity(intent); 
        int textViewNumber = position; 

       } 
     }); 
    } 

然后该项目通过的位置,所以你知道活动的自定义功能可按什么人它是和该行中的textview

快乐编码:)

您可以在convertView中查找任何TextView实例的子元素。此方法使用广度优先搜索算法来搜索TextView实例。

private void setOnClickListenerOnTextViews(View contentViev, OnClickListener listener) { 
      ArrayList<View> unvisited = new ArrayList<View>(); 
      unvisited.add(contentView); 
      while (!unvisited.isEmpty()) { 
       View child = unvisited.remove(0); 
       if(child instanceof TextView) { 
        child.setOnClickListener(listener); 
        continue; 
       } 
       if (!(child instanceof ViewGroup)){ 
        continue; 
       } 
       ViewGroup group = (ViewGroup) child; 
       final int childCount = group.getChildCount(); 
       for (int i=0; i< childCount; i++){ 
        unvisited.add(group.getChildAt(i)); 
       } 
      } 
      } 
} 

调用此方法在您的getView()方法:

public View getView(.....){ 
//... 
setOnClickListenerOnTextViews(convertView,mClickListener) 
return convertView; 
} 

编辑:对于复制和粘贴的解决方案着想,mClickListener是监听器实例代码中的某处:

private View.OnClickListener mClickListener = new View.OnclickListerner(){ 
@Override 
public void onClick(View v){ 
    //do your thing here. 
} 
}; 
+0

我得到编译错误'不能解决mClickListener'在哪里,我该如何设置? – iqueqiorio 2014-12-14 18:45:08

+0

为什么人们总是选择复制和粘贴解决方案? mClickListener是实例化代码中某处的接口实例。 – 2014-12-14 18:46:32

+0

我不知道你的意思,你能解释一下吗? – iqueqiorio 2014-12-14 18:47:54

最有效的方法是手动设置每个TextView的点击监听器。为什么?因为你已经发现他们(findViewById),所以再次遍历视图树是一个坏主意(Breadth First Search)。所以你所能做的就是创建一个函数,然后将你的TextViews传递给它。尽管你可以做一些重构来获得干净的代码。

 public void addClickListenerToTextView(TextView... textViewArray){ 

     final TextView[] finalTextViewArray = textViewArray; 

     for(int i = 0 ; i < finalTextViewArray.length-1 ; ++i){ 

      final int index = i; 
      textViewArray[i].setOnClickListener(new OnClickListener(){ 

        @Override 
        public void onClick(View v){ 
         Intent intent = new Intent(MainActivity.this, YourTargetActivity.class); 
         intent.putExtra("meal" + index ,finalTextViewArray[index].getText().toString()); 
         intent.putExtra("dayText" , finalTextViewArray[finalTextViewArray.length-1].getText().toString()); 
         startActivity(intent); 

        } 
      }); 
     } 
    } 

,那么你可以调用这个函数是这样的:

addClickListenerToTextView(mealOne_Three,mealTwo_Three,mealThree_Three,dayText_Three); 

所以每次休息之前调用上面的函数与所有的textviews该行。请注意,您必须始终将day textview作为最后一个textview。

你可以不喜欢的一般OnClickListener保存,你需要为新Activity的所有信息:

public static final String[] weekdayStringArray = DateFormatSymbols.getInstance().getWeekdays(); 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ArrayList<String> stringArrayList = getItem(position); 
    String dayString = weekdayStringArray[dayNumber]; 

    MyClickListener myClicker = new MyClickListener(dayString); 

    switch (stringArrayList.size()) { 
    case 4: 
     convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.four_meal_item_view, parent, false); 
     TextView mealOne_Four = (TextView) convertView.findViewById(R.id.firstMealTextView); 
     TextView mealTwo_Four = (TextView) convertView.findViewById(R.id.secondMealTextView); 
     TextView mealThree_Four = (TextView) convertView.findViewById(R.id.thirdMealTextView); 
     TextView mealFour_Four = (TextView) convertView.findViewById(R.id.fourthMealTextView); 
     TextView dayText_Four = (TextView) convertView.findViewById(R.id.dayTextView); 
     dayText_Four.setText(dayString); 
     mealOne_Four.setText(stringArrayList.get(0).substring(0, 1).toUpperCase() + stringArrayList.get(0).substring(1).toLowerCase()); 
     mealTwo_Four.setText(stringArrayList.get(1).substring(0, 1).toUpperCase() + stringArrayList.get(1).substring(1).toLowerCase()); 
     mealThree_Four 
       .setText(stringArrayList.get(2).substring(0, 1).toUpperCase() + stringArrayList.get(2).substring(1).toLowerCase()); 
     mealFour_Four.setText(stringArrayList.get(3).substring(0, 1).toUpperCase() + stringArrayList.get(3).substring(1).toLowerCase()); 
     applyClickListeners(myClicker, mealOne_Four, mealTwo_Four, mealThree_Four, mealFour_Four, dayText_Four); 
     break; 
    case 3: 
     convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.three_meal_item_view, parent, false); 
     TextView mealOne_Three = (TextView) convertView.findViewById(R.id.firstMealTextView_Three); 
     TextView mealTwo_Three = (TextView) convertView.findViewById(R.id.secondMealTextView_Three); 
     TextView mealThree_Three = (TextView) convertView.findViewById(R.id.thirdMealTextView_Three); 
     TextView dayText_Three = (TextView) convertView.findViewById(R.id.dayTextView_Three); 
     dayText_Three.setText(dayString); 
     mealOne_Three.setText(stringArrayList.get(0).substring(0, 1).toUpperCase() + stringArrayList.get(0).substring(1).toLowerCase()); 
     mealTwo_Three.setText(stringArrayList.get(1).substring(0, 1).toUpperCase() + stringArrayList.get(1).substring(1).toLowerCase()); 
     mealThree_Three.setText(stringArrayList.get(2).substring(0, 1).toUpperCase() 
       + stringArrayList.get(2).substring(1).toLowerCase()); 
     applyClickListeners(myClicker, mealOne_Three, mealTwo_Three, mealThree_Three, dayText_Three); 
     break; 
    case 2: 
     convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.two_meal_item_view, parent, false); 
     TextView mealOne_Two = (TextView) convertView.findViewById(R.id.firstMealTextView_Two); 
     TextView mealTwo_Two = (TextView) convertView.findViewById(R.id.secondMealTextView_Two); 
     TextView dayText_Two = (TextView) convertView.findViewById(R.id.dayTextView_Two); 
     dayText_Two.setText(dayString); 
     mealOne_Two.setText(stringArrayList.get(0).substring(0, 1).toUpperCase() + stringArrayList.get(0).substring(1).toLowerCase()); 
     mealTwo_Two.setText(stringArrayList.get(1).substring(0, 1).toUpperCase() + stringArrayList.get(1).substring(1).toLowerCase()); 
     applyClickListeners(myClicker, mealOne_Two, mealTwo_Two, dayText_Two); 
     break; 
    case 1: 
     convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.one_meal_item_view, parent, false); 
     TextView mealOne_One = (TextView) convertView.findViewById(R.id.firstMealTextView_One); 
     TextView dayText_One = (TextView) convertView.findViewById(R.id.dayTextView_One); 
     dayText_One.setText(dayString); 
     mealOne_One.setText(stringArrayList.get(0).substring(0, 1).toUpperCase() + stringArrayList.get(0).substring(1).toLowerCase()); 
     applyClickListeners(myClicker, mealOne_One, dayText_One); 
     break; 
    case 0: 
     convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.zero_meal_item_view, parent, false); 
     TextView dayText_Zero = (TextView) convertView.findViewById(R.id.dayTextView_Zero); 
     dayText_Zero.setText(dayString + "(Closed)"); 
     applyClickListeners(myClicker, dayText_Zero); 
     break; 
    } 
    return convertView; 
} 

private void applyClickListeners(MyClickListener clicker, View... toApply) { 
    for (View view : toApply) { 
     view.setOnClickListener(clicker); 
    } 
} 

class MyClickListener implements View.OnClickListener { 

    private String dayText; 

    public MyClickListener(String dayText) { 
     this.dayText = dayText; 
    } 

    @Override 
    public void onClick(View v) { 
     // do your thing 
    } 

} 

您的活动实施监听,然后传递活动为听者每一个可点击的项目。这样你只需要创建一个监听器,它不会泄漏内存,如果你必须改变项目的显示方式,你不必改变每一个监听器。

  1. 创建适配器一个SoftReference的存储活动安全
  2. 传递活动,每一个的TextView作为听者
  3. 实现查看。OnClickListener在活动
  4. 演员你传递回一个TextView
  5. 的视图中创建一个新的意图
  6. 获取文本,将其连接到意图
  7. 开始新的活动