2013-06-24 6 views
5

Es gibt viele Diskussionen zu diesem Thema. Aber keiner von ihnen funktioniert für mich. Ich habe einen benutzerdefinierten ListView mit einem ImageView in der ListView implementiert und der ListView ist von der ListFragment erweitert. Meine ImageView ist anklickbar, so dass, wenn der Benutzer auf ImageView klickt, die Kameraaktivität aktiviert ist und die ImageView mit dem aufgenommenen Bild aktualisiert wird. Die XML wird wie untenSo richten Sie den onClickListener für die Bildansicht in der Listenansicht ein

<?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> 

nun gezeigt ist, ich brauche den Benutzer Klick zu unterscheiden, die für das Listenelement oder für das Image ist. Ich habe onListItemClick eingerichtet, das den Klick des Benutzers für das Listenelement in der ListView abfangen kann, aber wenn ich für ImageView klicke, funktioniert es nicht. Wie kann ich erkennen, wenn der Benutzer auf ImageView klickt? Meine ListFragment-Klasse ist wie folgt.

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


} 

Meine Adapterklasse ist wie folgt.

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

Ihre Adapter-Klasse setzen Imageview in dieser Ansicht erstellen Onclick Hörer enthält ... Antwort für u –

+0

@Tony Stark ich meine Adapter-Klasse setzen . – batuman

+0

was willst du etwas mehr Freund erklären –

Antwort

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

Ich setze die Haltepunkte in onListItemClick und onItemClick. Wenn auf eine Zeile in der ListView geklickt wird, wurde sie in onListItemClick gefangen. Aber wenn ich auf ImageView klicke, wird es nicht in beiden abgefangen. – batuman

+0

posten Sie bitte Ihre customList_Adaptor Klasse .. Problem ist in diesem .. – Sandy09

+0

danke ich habe gepostet, indem ich meine erste Abfrage bearbeitet habe. – batuman

1

Verwendung onItemClickListener statt 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

Verwenden onItemClickListener() für die Listenansicht und Sie können android:clickable="true" von Bildansicht entfernen. Die andere Möglichkeit besteht darin, onClickListener() für die Bildansicht in getView() festzulegen, wenn Sie den Adapter anpassen. Aber versuche es mit der ersten Annäherung.

+0

Ich habe beide getestet, nur der zweite Ansatz kann den ImageView-Klick erfassen. Der erste kann ImageView-Klick nicht erfassen. Der zweite ist jedoch innerhalb des ArrayAdapters implementiert, sodass es nicht möglich ist, ein Bild von der Kamera mit startActivityForResult zu erhalten. – batuman

1

In Ihrem Adapter-Klasse wird es getView sein, die für die Imageview

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

imageView.setOnClickListener(new OnClickListener() { 

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

      } 
     }); 
+0

Ja, dieser Ansatz wird innerhalb des ArrayAdapters implementiert, so dass ein Bild von der Kamera mit startActivityForResult nicht möglich ist. Aus diesem Grund muss ich die Kameraaktivität von der ListFragment-Klasse starten und das Bild mit startActivityForResult zurückholen, wenn der Benutzer auf ImageView klickt. – batuman

Verwandte Themen