仅可单击来自列表视图的 5 个文本视图中的 4 个文本视图 android
Clickable only 4 textview from 5 textview from listview android
在我问这里之前,我已经搜索并找到了答案:
long viewId = view.getId();
但是当我在我的代码中使用它时,它仍然是单击整个列表视图行而不是单击我想要单击的文本视图。这是实现该答案后的代码:
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView <? > parent, View view, int position, long id) {
long viewId = view.getId();
if (viewId == R.id.masterclass_name) {
Toast.makeText(getApplicationContext(), "masterclass_name clicked", Toast.LENGTH_SHORT).show();
final Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
dialog.setContentView(R.layout.dialog_popup_pesan_kelas);
pesan_kelas = (TextView) dialog.findViewById(R.id.pesan_kelas);
sukses = (TextView) dialog.findViewById(R.id.sukses);
studio_name = (TextView) dialog.findViewById(R.id.studio_name);
mohon_hadir = (TextView) dialog.findViewById(R.id.mohon_hadir);
booking_number = (TextView) dialog.findViewById(R.id.booking_number);
indentitas_resmi = (TextView) dialog.findViewById(R.id.indentitas_resmi);
bookbutton = (Button) dialog.findViewById(R.id.bookbutton);
selesaibutton = (Button) dialog.findViewById(R.id.selesaibutton);
bookbutton.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
pesan_kelas.setVisibility(View.GONE);
sukses.setVisibility(View.VISIBLE);
bookbutton.setVisibility(View.GONE);
selesaibutton.setVisibility(View.VISIBLE);
mohon_hadir.setVisibility(View.VISIBLE);
booking_number.setVisibility(View.VISIBLE);
indentitas_resmi.setVisibility(View.VISIBLE);
}
});
selesaibutton.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
dialog.dismiss();
}
});
closedialog = (ImageView) dialog.findViewById(R.id.closeDialog);
closedialog.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
dialog.dismiss();
}
});
studio_name.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
Intent intent = new Intent(context, StudioDetail.class);
startActivity(intent);
}
});
dialog.show();
} else if (viewId == R.id.studio_nama) {
Toast.makeText(getApplicationContext(), "studio_nama clicked", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(context, StudioDetail.class);
startActivity(intent);
} else if (viewId == R.id.trainer_name) {
Toast.makeText(getApplicationContext(), "trainer_name clicked", Toast.LENGTH_SHORT).show();
} else if (viewId == R.id.area) {
Toast.makeText(getApplicationContext(), "area clicked", Toast.LENGTH_SHORT).show();
} else {
CariKelasAdapter carikelas = (CariKelasAdapter) parent.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), carikelas.getMasterclass_name(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(context, checkin.class);
startActivity(intent);
}
}
});
我要单击的文本视图具有 id:masterclass_name、studio_nama、trainer_name、area。还有另一个 textview id,但我不希望可以单击该 id。所以只能点击5个textview中的4个textview。
每个(来自 4 个)textview 将重定向到不同的结果,例如:一个将显示对话框,另一个将重定向到另一个 activity class.
我的代码有什么问题(为什么那个答案对我的代码不起作用)? How/what 是使 4 textview 变为可点击的正确代码吗?
有关信息,这是我的适配器 getView() :
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// convert view = design
View v = convertView;
if (v == null) {
holder = new ViewHolder();
v = vi.inflate(Resource, null);
holder.image_carikelas = (ImageView) v.findViewById(R.id.image_carikelas);
holder.masterclass_name = (TextView) v.findViewById(R.id.masterclass_name);
holder.studio_nama = (TextView) v.findViewById(R.id.studio_nama);
holder.trainer_name = (TextView) v.findViewById(R.id.trainer_name);
holder.area = (TextView) v.findViewById(R.id.area);
holder.facility = (TextView) v.findViewById(R.id.facility);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
//holder.imageview.setImageResource(R.drawable.promo_1);
new DownloadImageTask(holder.image_carikelas).execute(kelasList.get(position).getImage());
holder.masterclass_name.setText(kelasList.get(position).getName());
holder.studio_nama.setText(kelasList.get(position).getStudio_nama());
holder.trainer_name.setText("Trainer: " + kelasList.get(position).getTrainer_name());
holder.area.setText("Area: " + kelasList.get(position).getArea());
holder.facility.setText("Facility: " + kelasList.get(position).getFacility());
return v;
}
我认为您根本不应该使用 setOnItemClickListener。那是为了单击 ListView 中的整个项目。
您应该为 4 个文本视图创建 4 个 OnClickListeners,并在适配器的 getView() 中使用 setOnClickListener 将 4 个文本视图 link 分配给那些 OnClickListeners。
通常你应该将项目位置设置为每个textview的标签,这样在OnClickListener中你可以知道它被点击了哪个项目 view.getTag()
示例:
public class MyAdapter extends BaseAdapter {
private MyActivity mActivity
public MyAdapter(MyActivity activity) {
mActivity = activity;
}
View.OnClickListener listener1 = new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = (int)v.getTag();
// do stuff based on position or kelasList.get(position)
// you can call mActivity.startActivity() if you need
}
};
// similar for listener2,3,4
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// convert view = design
View v = convertView;
if (v == null) {
holder = new ViewHolder();
v = vi.inflate(Resource, null);
holder.image_carikelas = (ImageView) v.findViewById(R.id.image_carikelas);
holder.masterclass_name = (TextView) v.findViewById(R.id.masterclass_name);
holder.studio_nama = (TextView) v.findViewById(R.id.studio_nama);
holder.trainer_name = (TextView) v.findViewById(R.id.trainer_name);
holder.area = (TextView) v.findViewById(R.id.area);
holder.facility = (TextView) v.findViewById(R.id.facility);
// set OnClickListeners
holder.studio_nama.setOnClickListener(listener1);
holder.trainer_name.setOnClickListener(listener2);
holder.area.setOnClickListener(listener3);
holder.facility.setOnClickListener(listener4);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
//holder.imageview.setImageResource(R.drawable.promo_1);
new DownloadImageTask(holder.image_carikelas).execute(kelasList.get(position).getImage());
holder.masterclass_name.setText(kelasList.get(position).getName());
holder.studio_nama.setText(kelasList.get(position).getStudio_nama());
holder.trainer_name.setText("Trainer: " + kelasList.get(position).getTrainer_name());
holder.area.setText("Area: " + kelasList.get(position).getArea());
holder.facility.setText("Facility: " + kelasList.get(position).getFacility());
// set tags
holder.studio_nama.setTag(position);
holder.trainer_name.setTag(position);
holder.area.setTag(position);
holder.facility.setTag(position);
return v;
}
}
在我问这里之前,我已经搜索并找到了答案:
long viewId = view.getId();
但是当我在我的代码中使用它时,它仍然是单击整个列表视图行而不是单击我想要单击的文本视图。这是实现该答案后的代码:
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView <? > parent, View view, int position, long id) {
long viewId = view.getId();
if (viewId == R.id.masterclass_name) {
Toast.makeText(getApplicationContext(), "masterclass_name clicked", Toast.LENGTH_SHORT).show();
final Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
dialog.setContentView(R.layout.dialog_popup_pesan_kelas);
pesan_kelas = (TextView) dialog.findViewById(R.id.pesan_kelas);
sukses = (TextView) dialog.findViewById(R.id.sukses);
studio_name = (TextView) dialog.findViewById(R.id.studio_name);
mohon_hadir = (TextView) dialog.findViewById(R.id.mohon_hadir);
booking_number = (TextView) dialog.findViewById(R.id.booking_number);
indentitas_resmi = (TextView) dialog.findViewById(R.id.indentitas_resmi);
bookbutton = (Button) dialog.findViewById(R.id.bookbutton);
selesaibutton = (Button) dialog.findViewById(R.id.selesaibutton);
bookbutton.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
pesan_kelas.setVisibility(View.GONE);
sukses.setVisibility(View.VISIBLE);
bookbutton.setVisibility(View.GONE);
selesaibutton.setVisibility(View.VISIBLE);
mohon_hadir.setVisibility(View.VISIBLE);
booking_number.setVisibility(View.VISIBLE);
indentitas_resmi.setVisibility(View.VISIBLE);
}
});
selesaibutton.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
dialog.dismiss();
}
});
closedialog = (ImageView) dialog.findViewById(R.id.closeDialog);
closedialog.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
dialog.dismiss();
}
});
studio_name.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
Intent intent = new Intent(context, StudioDetail.class);
startActivity(intent);
}
});
dialog.show();
} else if (viewId == R.id.studio_nama) {
Toast.makeText(getApplicationContext(), "studio_nama clicked", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(context, StudioDetail.class);
startActivity(intent);
} else if (viewId == R.id.trainer_name) {
Toast.makeText(getApplicationContext(), "trainer_name clicked", Toast.LENGTH_SHORT).show();
} else if (viewId == R.id.area) {
Toast.makeText(getApplicationContext(), "area clicked", Toast.LENGTH_SHORT).show();
} else {
CariKelasAdapter carikelas = (CariKelasAdapter) parent.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), carikelas.getMasterclass_name(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(context, checkin.class);
startActivity(intent);
}
}
});
我要单击的文本视图具有 id:masterclass_name、studio_nama、trainer_name、area。还有另一个 textview id,但我不希望可以单击该 id。所以只能点击5个textview中的4个textview。
每个(来自 4 个)textview 将重定向到不同的结果,例如:一个将显示对话框,另一个将重定向到另一个 activity class.
我的代码有什么问题(为什么那个答案对我的代码不起作用)? How/what 是使 4 textview 变为可点击的正确代码吗?
有关信息,这是我的适配器 getView() :
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// convert view = design
View v = convertView;
if (v == null) {
holder = new ViewHolder();
v = vi.inflate(Resource, null);
holder.image_carikelas = (ImageView) v.findViewById(R.id.image_carikelas);
holder.masterclass_name = (TextView) v.findViewById(R.id.masterclass_name);
holder.studio_nama = (TextView) v.findViewById(R.id.studio_nama);
holder.trainer_name = (TextView) v.findViewById(R.id.trainer_name);
holder.area = (TextView) v.findViewById(R.id.area);
holder.facility = (TextView) v.findViewById(R.id.facility);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
//holder.imageview.setImageResource(R.drawable.promo_1);
new DownloadImageTask(holder.image_carikelas).execute(kelasList.get(position).getImage());
holder.masterclass_name.setText(kelasList.get(position).getName());
holder.studio_nama.setText(kelasList.get(position).getStudio_nama());
holder.trainer_name.setText("Trainer: " + kelasList.get(position).getTrainer_name());
holder.area.setText("Area: " + kelasList.get(position).getArea());
holder.facility.setText("Facility: " + kelasList.get(position).getFacility());
return v;
}
我认为您根本不应该使用 setOnItemClickListener。那是为了单击 ListView 中的整个项目。
您应该为 4 个文本视图创建 4 个 OnClickListeners,并在适配器的 getView() 中使用 setOnClickListener 将 4 个文本视图 link 分配给那些 OnClickListeners。
通常你应该将项目位置设置为每个textview的标签,这样在OnClickListener中你可以知道它被点击了哪个项目 view.getTag()
示例:
public class MyAdapter extends BaseAdapter {
private MyActivity mActivity
public MyAdapter(MyActivity activity) {
mActivity = activity;
}
View.OnClickListener listener1 = new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = (int)v.getTag();
// do stuff based on position or kelasList.get(position)
// you can call mActivity.startActivity() if you need
}
};
// similar for listener2,3,4
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// convert view = design
View v = convertView;
if (v == null) {
holder = new ViewHolder();
v = vi.inflate(Resource, null);
holder.image_carikelas = (ImageView) v.findViewById(R.id.image_carikelas);
holder.masterclass_name = (TextView) v.findViewById(R.id.masterclass_name);
holder.studio_nama = (TextView) v.findViewById(R.id.studio_nama);
holder.trainer_name = (TextView) v.findViewById(R.id.trainer_name);
holder.area = (TextView) v.findViewById(R.id.area);
holder.facility = (TextView) v.findViewById(R.id.facility);
// set OnClickListeners
holder.studio_nama.setOnClickListener(listener1);
holder.trainer_name.setOnClickListener(listener2);
holder.area.setOnClickListener(listener3);
holder.facility.setOnClickListener(listener4);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
//holder.imageview.setImageResource(R.drawable.promo_1);
new DownloadImageTask(holder.image_carikelas).execute(kelasList.get(position).getImage());
holder.masterclass_name.setText(kelasList.get(position).getName());
holder.studio_nama.setText(kelasList.get(position).getStudio_nama());
holder.trainer_name.setText("Trainer: " + kelasList.get(position).getTrainer_name());
holder.area.setText("Area: " + kelasList.get(position).getArea());
holder.facility.setText("Facility: " + kelasList.get(position).getFacility());
// set tags
holder.studio_nama.setTag(position);
holder.trainer_name.setTag(position);
holder.area.setTag(position);
holder.facility.setTag(position);
return v;
}
}