列表视图中的 OnItemClickListener 与 OnclickListener android
OnItemClickListener vs OnclickListener in listview android
由于代码原因,这会很长。所以我有一个关于 OnItemclickListener 和 OnclickListener 的问题,这里我有两个代码,每个代码都有效,所以有没有偏好使用两者之一或者我可以使用任何人???
这是带有 OnItemClickListener
的代码
public class MainActivity extends AppCompatActivity {
private ArrayList<String> numbers=new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //a listview with id "list"
ListView numberLV = (ListView) findViewById(R.id.list);
numbers.add("one");
numbers.add("two");
numbers.add("three");
numbers.add("four");
// and so on
listAdapter itemadapter=new listAdapter(this,numbers);
numberLV.setAdapter(itemadapter);
numberLV.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String num=numbers.get(position);
String display="You have clicked "+num;
Toast.makeText(MainActivity.this,display,Toast.LENGTH_SHORT).show();
}
});
}
}
class listAdapter extends ArrayAdapter<String> {
public listAdapter(@NonNull Context context, ArrayList<String> numbers){
super(context,0,numbers);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View listItemView = convertView;
if(listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(
R.layout.list_num, parent, false);
}
TextView tvnum=(TextView) listItemView.findViewById(R.id.numbersTV);
String num=getItem(position);
tvnum.setText(num);
return listItemView;
}
}
这是一个带有 OnClickListener 的
public class MainActivity extends AppCompatActivity {
private ArrayList<String> numbers=new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //a listview with id "list"
ListView numberLV = (ListView) findViewById(R.id.list);
numbers.add("one");
numbers.add("two");
numbers.add("three");
numbers.add("four");
// and so on
listAdapter itemadapter=new listAdapter(this,numbers);
numberLV.setAdapter(itemadapter);
}
}
class listAdapter extends ArrayAdapter<String> {
public listAdapter(@NonNull Context context, ArrayList<String> numbers){
super(context,0,numbers);
}
@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View listItemView = convertView;
if(listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(
R.layout.list_num, parent, false);
}
TextView tvnum=(TextView) listItemView.findViewById(R.id.numbersTV);
String num=getItem(position);
tvnum.setText(num);
listItemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String display="You have clicked "+getItem(position);
Toast.makeText(getContext(),display,Toast.LENGTH_SHORT).show();
}
});
return listItemView;
}
}
两个代码对我来说都正常工作,但困惑是第二个代码是对还是错??
适配器
如上面第一条评论所述,setOnItemClickListener
是将点击侦听器附加到适配器项目的首选方式。
查看
在你的第二种情况下,你在 getView
方法中的单个项目上附加了 setOnClickListener
这也是有效的,因为在这种情况下 ItemView 是一个 间接子类 在 View
上,最初在 setOnClickListener
上声明。
我认为 setOnItemClickListener() 比 onClickListener() 最好,因为,
- 它让您在 activity 或 ListView 定义的片段中单击单行。
- 当你想在 onItemClickListener() 上执行操作时更容易,例如打开另一个 activity 或片段。
- 我们可以在项目点击方法中使用 view.getTag() 方法获取选定行列表对象。
- 如果您有来自 Web api 的调用数据,例如 soap 或 restful 在列表视图项上单击,那么实现它是一种简单的方法。
由于代码原因,这会很长。所以我有一个关于 OnItemclickListener 和 OnclickListener 的问题,这里我有两个代码,每个代码都有效,所以有没有偏好使用两者之一或者我可以使用任何人??? 这是带有 OnItemClickListener
的代码public class MainActivity extends AppCompatActivity {
private ArrayList<String> numbers=new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //a listview with id "list"
ListView numberLV = (ListView) findViewById(R.id.list);
numbers.add("one");
numbers.add("two");
numbers.add("three");
numbers.add("four");
// and so on
listAdapter itemadapter=new listAdapter(this,numbers);
numberLV.setAdapter(itemadapter);
numberLV.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String num=numbers.get(position);
String display="You have clicked "+num;
Toast.makeText(MainActivity.this,display,Toast.LENGTH_SHORT).show();
}
});
}
}
class listAdapter extends ArrayAdapter<String> {
public listAdapter(@NonNull Context context, ArrayList<String> numbers){
super(context,0,numbers);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View listItemView = convertView;
if(listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(
R.layout.list_num, parent, false);
}
TextView tvnum=(TextView) listItemView.findViewById(R.id.numbersTV);
String num=getItem(position);
tvnum.setText(num);
return listItemView;
}
}
这是一个带有 OnClickListener 的
public class MainActivity extends AppCompatActivity {
private ArrayList<String> numbers=new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //a listview with id "list"
ListView numberLV = (ListView) findViewById(R.id.list);
numbers.add("one");
numbers.add("two");
numbers.add("three");
numbers.add("four");
// and so on
listAdapter itemadapter=new listAdapter(this,numbers);
numberLV.setAdapter(itemadapter);
}
}
class listAdapter extends ArrayAdapter<String> {
public listAdapter(@NonNull Context context, ArrayList<String> numbers){
super(context,0,numbers);
}
@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
View listItemView = convertView;
if(listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(
R.layout.list_num, parent, false);
}
TextView tvnum=(TextView) listItemView.findViewById(R.id.numbersTV);
String num=getItem(position);
tvnum.setText(num);
listItemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String display="You have clicked "+getItem(position);
Toast.makeText(getContext(),display,Toast.LENGTH_SHORT).show();
}
});
return listItemView;
}
}
两个代码对我来说都正常工作,但困惑是第二个代码是对还是错??
适配器
如上面第一条评论所述,setOnItemClickListener
是将点击侦听器附加到适配器项目的首选方式。
查看
在你的第二种情况下,你在 getView
方法中的单个项目上附加了 setOnClickListener
这也是有效的,因为在这种情况下 ItemView 是一个 间接子类 在 View
上,最初在 setOnClickListener
上声明。
我认为 setOnItemClickListener() 比 onClickListener() 最好,因为,
- 它让您在 activity 或 ListView 定义的片段中单击单行。
- 当你想在 onItemClickListener() 上执行操作时更容易,例如打开另一个 activity 或片段。
- 我们可以在项目点击方法中使用 view.getTag() 方法获取选定行列表对象。
- 如果您有来自 Web api 的调用数据,例如 soap 或 restful 在列表视图项上单击,那么实现它是一种简单的方法。