Il y a beaucoup de discussions pour ce sujet. Mais aucun d'entre eux ne travaille pour moi.
J'ai mis en œuvre une liste personnalisée avec un est maintenant nécessaire de différencier le clic de l'utilisateur qui correspond à l'élément de la liste ou pour l'imageView. I Configuration ma classe d'adaptateur est comme suit. P> imageview code> dans le listview code> et le code code> est étendu à partir du listfragment code>. Mon imageView est cliquable de manière à ce que lorsque l'utilisateur clique sur ImageView, l'activité de la caméra est activée et l'imageView est mise à jour avec l'image capturée. Le XML est comme indiqué ci-dessous OnlistitemCllick Code> Cacher Capcher Cliquer pour l'utilisateur de l'élément de la liste dans la liste de liste, mais lorsque je clique pour l'imageView, cela ne fonctionne pas. Comment puis-je détecter lorsque l'utilisateur cliquer sur ImageView. Ma classe ListFraGment est comme indiqué ci-dessous. P> public class customList_Adaptor extends ArrayAdapter<String>{
protected static final int CAMERA_REQUEST = 0;
private Context context;
private List<String> listIDs = new ArrayList<String>();
public customList_Adaptor(Context context, int textViewResourceId,
List<String> objects) {
super(context, textViewResourceId, objects);
this.setContext(context);
this.listIDs = objects;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
if(listIDs != null)
return listIDs.size();
else
return 0;
}
@Override
public String getItem(int arg0) {
// TODO Auto-generated method stub
if(listIDs != null)
return listIDs.get(arg0);
else
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
ViewHolder viewHolder=new ViewHolder();
LayoutInflater inflater = (LayoutInflater) this.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(vi==null){
vi = inflater.inflate(R.layout.list_row, parent, false);
viewHolder.id=(TextView)vi.findViewById(R.id.title);
viewHolder.thumbnailImage=(ImageView)vi.findViewById(R.id.list_image);
viewHolder.arrow=(ImageView)vi.findViewById(R.id.list_arrow);
vi.setTag(viewHolder);
}
else
viewHolder=(ViewHolder) vi.getTag();
// viewHolder.thumbnailImage.setOnClickListener(new OnClickListener(){
//
// @Override
// public void onClick(View arg0) {
// // TODO Auto-generated method stub
// Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
// ((Activity)context).startActivityForResult(cameraIntent, CAMERA_REQUEST);
// }
//
// });
// Setting all values in listview
viewHolder.id.setText(listIDs.get(position));
return vi;
}
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
}
4 Réponses :
Utilisez OnitemClickListener strong> au lieu de OnlistitemCllick strong>
public class MyListFragment extends ListFragment implements OnItemClickListener {
private customList_Adaptor adapter;
private static final int CAMERA_REQUEST = 0;
private static final int RESULT_OK = 0;
private static MyListFragmentInterface mCallback = null;
static Context thisListFragmentContext = null;
private String[] mListItems;
private TrackerDBAdapter dbHelper;
private List<String> listIDs;
public MyListFragment() {
}
public MyListFragment(MyListFragmentInterface callback) {
mCallback = callback;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.my_list_fragment, container, false);
dbHelper = new TrackerDBAdapter(getActivity());
dbHelper.open();
Cursor cursor = dbHelper.fetchAllTrackerInTheList();
mListItems = new String[dbHelper.getLastInsertedID()];
thisListFragmentContext = getActivity();
int i = 0;
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
mListItems[i++] = cursor.getString(1);
dbHelper.close();
listIDs = new ArrayList<String>();
listIDs = Arrays.asList(mListItems);
adapter = new customList_Adaptor(thisListFragmentContext, R.layout.list_row, listIDs,this);
ListView lv = (ListView) view.findViewById(android.R.id.list);
lv.setAdapter(adapter);
lv.setOnItemClickListener(this);
return view;
}
public void addNewTrackerintoListDisplay(TrackerInfo newTracker){
mListItems = append(mListItems, newTracker.getIdnumber());
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1,
mListItems));
}
@SuppressLint("NewApi")
private String[] append(String[] mListItems2, String idnumber) {
// TODO Auto-generated method stub
final int N = mListItems2.length;
mListItems2 = Arrays.copyOf(mListItems2, N + 1);
mListItems2[N] = idnumber;
return mListItems2;
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
mCallback.itemSelected(mListItems[position]);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
}
public void imagepos(int i){
//onImage click comes here
}
}
-----------------------------------------------------
public class customList_Adaptor extends ArrayAdapter<String>{
protected static final int CAMERA_REQUEST = 0;
private Context context;
MyListFragment mMyListFragment;
private List<String> listIDs = new ArrayList<String>();
public customList_Adaptor(Context context, int textViewResourceId,
List<String> objects, MyListFragment mMyListFragment) {
super(context, textViewResourceId, objects);
this.setContext(context);
this.listIDs = objects;
this.mMyListFragment= mMyListFragment
}
@Override
public int getCount() {
// TODO Auto-generated method stub
if(listIDs != null)
return listIDs.size();
else
return 0;
}
@Override
public String getItem(int arg0) {
// TODO Auto-generated method stub
if(listIDs != null)
return listIDs.get(arg0);
else
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
ViewHolder viewHolder=new ViewHolder();
LayoutInflater inflater = (LayoutInflater) this.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(vi==null){
vi = inflater.inflate(R.layout.list_row, parent, false);
viewHolder.id=(TextView)vi.findViewById(R.id.title);
viewHolder.thumbnailImage=(ImageView)vi.findViewById(R.id.list_image);
viewHolder.arrow=(ImageView)vi.findViewById(R.id.list_arrow);
vi.setTag(viewHolder);
}
else
viewHolder=(ViewHolder) vi.getTag();
viewHolder.thumbnailImage.setOnClickListener(new onMyClick(position));
// Setting all values in listview
viewHolder.id.setText(listIDs.get(position));
return vi;
}
public class onMyClick implements OnClickListener {
private final int pos;
public onMyClick(int pos) {
this.pos = pos;
}
@Override
public void onClick(View v) {
mMyListFragment.imagepos(pos);
}
}
public Context getContext() {
return context;
}
public void setContext(Context context) {
this.context = context;
}
}
Je fixe les points d'arrêt à l'intérieur de OnlistitemClick et OnitemClick. Lorsqu'une rangée dans la liste de liste est cliquée, il a été attrapé à l'intérieur de OnlistitemClick. Mais quand je clique sur ImageView, il n'est pas attrapé dans les deux.
Vérifiez maintenant .. sur Image Cliquez sur ImagePosPoster
Utiliser OnItemClickListener () Code> Pour la listeView et vous pouvez supprimer Android: Clickable = "vrai" code> à partir de la vue Image. L'autre sens consiste à définir onclicklistener () code> pour la vue d'image dans greview () code> si vous personnalisez l'adaptateur. mais essayez avec la première approche. P>
J'ai testé les deux, seule la deuxième approche peut attraper le clic imageView. Le premier ne peut pas attraper imageView click. Mais la seconde est mise en œuvre à l'intérieur de l'arrayadapter, afin de récupérer l'image de la caméra avec startActivityForresult n'est pas possible.
dans votre classe d'adaptateur, il y aura GeRVView contenant imageview Dans cette vue Créer une auditeur Onclick pour l'imageView
Imageview imageView=(ImageView)view.findviewByid(your id);
imageView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
Ouais, cette approche met en œuvre à l'intérieur de l'arrayadapter, afin d'obtenir une image de la caméra avec startActivityForresult n'est pas possible. C'est pourquoi j'ai besoin de démarrer l'activité de la caméra à partir de la classe ListFraGment et de récupérer l'image avec StarTactivityForresult lorsque l'utilisateur cliquez sur ImageView.
Mettez votre classe d'adaptateur ... répondre pour vous
@Tony Stark je mets ma classe d'adaptateur.
ce que tu veux expliquer un peu plus d'ami
si vous devez cliquer sur et sélectionner l'image pour le listItem
Ce que je veux, c'est quand je clique sur l'imageView sur la liste de réception, je souhaite attraper ce clic afin que je puisse activer l'activité de la caméra et capturer l'image et le charger sur l'imageView. Maintenant, vous ne pouvez pas attraper le clic imageView. Je ne peux attraper que le clic sur la ligne de la liste de liste à l'intérieur de l'OnlistitemClick ().
Oui si je clique ou touche l'imageView.