2013-06-24 13 views
5

Ci sono molte discussioni per questo argomento. Ma nessuno di loro lavora per me. Ho implementato un ListView personalizzato con un ImageView nello ListView e lo ListView viene esteso da ListFragment. My ImageView è selezionabile in modo che quando l'utente fa clic su ImageView, l'attività Camera viene attivata e ImageView viene aggiornato con l'immagine acquisita. L'XML è la seguenteCome configurare onClickListener per la visualizzazione di immagini nella Listview

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/list_background_selector" 
    android:orientation="horizontal" 
    android:padding="5dip" > 

    <!-- ListRow Left sied Thumbnail image --> 
    <LinearLayout android:id="@+id/thumbnail" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="3dip" 
     android:layout_alignParentLeft="true" 
     android:background="@drawable/image_bg" 
     android:layout_marginRight="5dip"> 

     <ImageView 
      android:id="@+id/list_image" 
      android:layout_width="50dip" 
      android:clickable="true" 
      android:focusable="false" 
      android:contentDescription="@string/image_view_description" 
      android:layout_height="50dip" 
      android:src="@drawable/icons_preview" 
      /> 

    </LinearLayout> 

</RelativeLayout> 

Ora che ho bisogno di differenziare il clic dell'utente, che è per la voce di elenco o per l'ImageView. Ho impostato onListItemClick che può intercettare il clic dell'utente per la voce di elenco in ListView, ma quando clicco per ImageView, non funziona. Come posso rilevare quando l'utente fa clic sul ImageView. La mia classe ListFragment è come mostrato di seguito.

public class MyListFragment extends ListFragment { 
    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); 
     ListView lv = (ListView) view.findViewById(android.R.id.list);  
     lv.setAdapter(adapter);  



     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 onListItemClick(ListView l, View v, int position, long id) { 

     mCallback.itemSelected(mListItems[position]); 
    } 


} 

La mia classe di adattatore è la seguente.

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; 
    } 


} 
+0

mettere la vostra classe di adattatori ... risposta per u –

+0

@Tony Stark Ho messo la mia classe di adattatori . – batuman

+0

cosa vuoi spiegare un po 'più amico –

risposta

1
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; 
     } 


    } 
+0

Ho impostato i punti di interruzione all'interno di onListItemClick e onItemClick. Quando si fa clic su una riga in ListView, questa viene catturata all'interno di onListItemClick. Ma quando faccio clic su ImageView, non viene catturato in entrambi. – batuman

+0

per favore pubblica la tua classe customList_Adaptor .. il problema è in questo .. – Sandy09

+0

grazie che ho pubblicato modificando la mia prima query. – batuman

1

uso onItemClickListener invece di onListItemClick

lv.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(ListView l, View v, int position, long id) { 
     // TODO Auto-generated method stub 
     mCallback.itemSelected(mListItems[position]); 

    } 
}); 
0

Usa onItemClickListener() per la listview ed è possibile rimuovere android:clickable="true" da Vista. L'altro modo è impostare onClickListener() per la visualizzazione dell'immagine in getView() se si sta personalizzando l'adattatore. ma prova con il primo approccio.

+0

Ho provato entrambi, solo il secondo approccio può catturare il clic ImageView. Il primo non può catturare il clic di ImageView. Ma il secondo è implementato all'interno del ArrayAdapter, quindi per ottenere l'immagine dalla fotocamera con startActivityForResult non è possibile. – batuman

1

Nella classe Adapter ci saranno GetView che contiene imageview in quella vista creare ascoltatore onclick per l'imageview

Imageview imageView=(ImageView)view.findviewByid(your id); 

imageView.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

      } 
     }); 
+0

Sì, questo approccio si sta implementando all'interno del ArrayAdapter, quindi per ottenere l'immagine dalla fotocamera con startActivityForResult non è possibile. Questo è il motivo per cui ho bisogno di avviare l'attività della telecamera dalla classe ListFragment e recuperare l'immagine con startActivityForResult quando l'utente fa clic su ImageView. – batuman

Problemi correlati