2015-09-01 3 views
-1

Я пытаюсь создать собственный список, используя пользовательский адаптер и фрагмент. Я могу сделать представление списка. Но есть одна проблема: у меня есть кнопка изображения и текстовый вид в строке. Я хочу прослушать событие щелчка строки, а также событие щелчка кнопки «Изображение». Другими словами, мне нужно добавить слушателя, который будет прослушивать, когда щелкнет строка, и когда нажата кнопка изображения, присутствующая в строке.Как добавить слушателя в android на строку?

Вот мой код:

пользовательский адаптер

public class CustomAdapter extends BaseAdapter implements View.OnClickListener { 

    private Activity activity; 
    private ArrayList data; 
    private static LayoutInflater inflater = null; 


    public CustomAdapter(Activity a, ArrayList d) { 

     /********** Take passed values **********/ 
     activity = a; 
     data = d; 
     inflater = (LayoutInflater) activity. 
       getSystemService(Context.LAYOUT_INFLATER_SERVICE); 


    } 


    @Override 
    public int getCount() { 
     if (data.size() <= 0) 
      return 1; 
     return data.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    @Override 
    public void onClick(View v) { 

     Log.d("row is click","row click"); 

    } 

    /********* 
    * Create a holder Class to contain inflated xml file elements 
    *********/ 
    public static class ViewHolder { 

     public TextView text; 

     public ImageButton imageButton; 

    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View vi = convertView; 
     ViewHolder holder; 

     if (convertView == null) { 

      /****** Inflate tabitem.xml file for each row (Defined below) *******/ 
      vi = inflater.inflate(R.layout.row_layout, null); 

      /****** View Holder Object to contain tabitem.xml file elements ******/ 

      holder = new ViewHolder(); 
      holder.text = (TextView) vi.findViewById(R.id.station_name); 

      holder.imageButton = (ImageButton) vi.findViewById(R.id.favorite); 

      /************ Set holder with LayoutInflater ************/ 
      vi.setTag(holder); 
     } else 
      holder = (ViewHolder) vi.getTag(); 

     if (data.size() <= 0) { 
      holder.text.setText("No Data"); 

     } else { 

      String string = (String) data.get(position); 

      /************ Set Model values in Holder elements ***********/ 

      holder.text.setText(string); 


     } 
     return vi; 
    } 
} 

row_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" 
    android:descendantFocusability="blocksDescendants"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/station_name" 
     android:padding="10dp" 
     android:textColor="#eee345" 
     android:textAppearance="?android:textAppearanceLarge" 
     /> 

    <ImageButton android:id="@+id/favorite" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:src="@drawable/start" 
     android:background="#00ffffff" 
    /> 


</LinearLayout> 

fragmentone.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="#325633" 
    > 

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/list_view"> 
    </ListView> 

</LinearLayout> 

fragmentone.java

public class Fragmentone extends Fragment{ 

    ArrayList<String> name; 
    boolean isPressed=false; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_one, container, false); 
     name=new ArrayList<String>(); 
     name.add("First Station"); 
     name.add("Second Station"); 





     ListView listView = (ListView) view.findViewById(R.id.list_view); 

     CustomAdapter customAdapter =new CustomAdapter(getActivity(),name); 
     listView.setAdapter(customAdapter); 



     return view; 
    } 


} 
+0

Очень просто, добавьте клик слушателя для родительского компоновщика, так что вы можете слушать над строкой нажмите и добавьте клик-слушатель для отдельного просмотра в вашей строке, удалите itemonclick listener из вашего списка. – Madhu

+0

не могли бы вы дать код – user944513

+0

, просто вы можете добавить convertView.setOnClickListener –

ответ

1

Проверьте это этот код, если у вас есть какие-либо проблемы, чтобы понять комментарий

public class CustomAdapter extends BaseAdapter { 

    private Activity activity; 
    private ArrayList data; 
    private static LayoutInflater inflater = null; 

    public CustomAdapter(Activity a, ArrayList d) { 

     /********** Take passed values **********/ 
     activity = a; 
     data = d; 
     inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 

    @Override 
    public int getCount() { 
     if (data.size() <= 0) 
      return 1; 
     return data.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    /********* 
    * Create a holder Class to contain inflated xml file elements 
    *********/ 
    public static class ViewHolder { 

     public TextView text; 

     public ImageButton imageButton; 

    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     View vi = convertView; 
     ViewHolder holder; 

     if (convertView == null) { 

      /****** Inflate tabitem.xml file for each row (Defined below) *******/ 
      vi = inflater.inflate(R.layout.row_layout, null); 

      /****** View Holder Object to contain tabitem.xml file elements ******/ 

      holder = new ViewHolder(); 
      holder.text = (TextView) vi.findViewById(R.id.station_name); 

      holder.imageButton = (ImageButton) vi.findViewById(R.id.favorite); 

      /************ Set holder with LayoutInflater ************/ 
      vi.setTag(holder); 
     } else 
      holder = (ViewHolder) vi.getTag(); 

     if (data.size() <= 0) { 
      holder.text.setText("No Data"); 

     } else { 

      String string = (String) data.get(position); 

      /************ Set Model values in Holder elements ***********/ 

      holder.text.setText(string); 

     } 

     // this is for overall row click 
     convertView.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

      } 
     }); 
     // this is for image button onclick 
     holder.imageButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

      } 
     }); 
     ; 

     return vi; 
    } 
} 
+0

Спасибо @ madhu..I получил ответ, но как чтобы узнать, на какой строке пользователь нажимает. Я могу получить событие. но как идентифицировать, по какой строке нажать кнопку ..., чтобы узнать, по какой строке пользователь нажимает и на какой кнопке кнопки пользователя нажимать – user944513

+0

@ user944513, вы должны использовать позицию внутри прослушивателя кликов, чтобы определить, какая строка нажата. –

+0

@HareshChhelana Параметр положения находится на методе getview. Я могу использовать это>? – user944513

0

В классе, где активность вы определили ListView использовать setOnItemClickListener .. .

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

     /** here position indicate item clicked on list, 
      you can use SWITCH CASE to do things according to 
      position clicked.. 
     */ 
     }      
}); 

Это можно использовать в классе адаптера:

Row (View) Слушатель:

vi.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

    } 
}); 

слушатель Image:

holder.imageButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

    } 
}); 
+0

Спасибо .. Я получил ответ, но как узнать, на какой строке щелкнуть. Я способный получить событие. но как идентифицировать, на какой строке пользователь нажимает – user944513

+0

. Спасибо, я получил ответ, но как узнать, по какой строке пользователь щелкнул. Я могу получить событие. но как идентифицировать, по какой строке нажать кнопку ... знайте, на какой строке нажать кнопку и на какой кнопке нажмите кнопку – user944513

Смежные вопросы