设置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.
}
};
最有效的方法是手动设置每个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
}
}
您的活动实施监听,然后传递活动为听者每一个可点击的项目。这样你只需要创建一个监听器,它不会泄漏内存,如果你必须改变项目的显示方式,你不必改变每一个监听器。
- 创建适配器一个SoftReference的存储活动安全
- 传递活动,每一个的TextView作为听者
- 实现查看。OnClickListener在活动
- 演员你传递回一个TextView
- 的视图中创建一个新的意图
- 获取文本,将其连接到意图
- 开始新的活动
我得到编译错误'不能解决mClickListener'在哪里,我该如何设置? – iqueqiorio 2014-12-14 18:45:08
为什么人们总是选择复制和粘贴解决方案? mClickListener是实例化代码中某处的接口实例。 – 2014-12-14 18:46:32
我不知道你的意思,你能解释一下吗? – iqueqiorio 2014-12-14 18:47:54