如何隔离列表视图行中的单元格以用于 setOnItemClickListener 而不是整行



我有一个人员列表,我正在使用[修改的] SimpleCursorAdapter从数据库中提取人员。然后,我循环访问光标,并在应用的 ListView 中打印出信息。现在,它被编码为当我单击一行时,我的应用程序执行一个功能。但是,我想做的是,当我单击行中的图标时,我的应用程序将执行适当的功能。

我遇到麻烦的地方是隔离setOnItemClickListener行中的单元格而不是整行。

如何在行内隔离 ImageView 而不是整行本身?

这是我所拥有的:

首页.java

package myPackage;
public class Home extends Fragment {
    private View rootView;
    private AlternateRowColorSimpleCursorAdapter mySimpleCursorAdapter;
    private ViewPager myViewPager;
    private SwipeRefreshLayout studentSwipeRefresh;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        rootView = inflater.inflate(R.layout.home, container, false);
        myViewPager = (ViewPager) getActivity().findViewById(R.id.pager);
        studentSwipeRefresh = (SwipeRefreshLayout) rootView.findViewById(R.id.student_swipe_refresh);
        return rootView;
    }
    @Override
    public void onViewCreated(View rootView, Bundle savedInstanceState) {
        super.onViewCreated(rootView, savedInstanceState);
        drawTheStudentView();
        studentSwipeRefresh.setColorSchemeColors(Color.parseColor(Constants.RED), Color.parseColor(Constants.ORANGE), Color.parseColor(Constants.YELLOW), Color.parseColor(Constants.GREEN), Color.parseColor(Constants.BLUE), Color.parseColor(Constants.INDIGO), Color.parseColor(Constants.VIOLET));
        studentSwipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                studentSwipeRefresh.setRefreshing(false);
                drawTheStudentView();
            }
        });
    }
    private void drawTheStudentView(){
        DatabaseHelper myDBHelper = new DatabaseHelper(getActivity());
        Cursor studentCursor = myDBHelper.getStudentsCursor();
        String[] fromColumns = {"_id","studentID","status","location"};
        int[] toViews = {R.id.student_number_textview, R.id.student_id_textview};
        mySimpleCursorAdapter = new AlternateRowColorSimpleCursorAdapter(getActivity(), R.layout.student_layout, studentCursor, fromColumns, toViews, 0);
        // Replace the _id column with a student count
        mySimpleCursorAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
            @Override
            public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
                String counter = Integer.toString((cursor.getPosition()+1));
                TextView modifiedTextView = (TextView) view;
                if(columnIndex == 0){
                    modifiedTextView.setText(counter);
                    return true;
                }
                return false;
            }
        });
        ListView myListView = (ListView) rootView.findViewById(R.id.student_row);
        // Listen for somebody clicking on a Student ID, and process
        myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Cursor subCursor = (Cursor) mySimpleCursorAdapter.getItem(position);
                String zapNumber = subCursor.getString(subCursor.getColumnIndex("studentID"));
                StudentStatus studentStatus = (StudentStatus) getFragmentManager().findFragmentByTag(getFragmentTag(Constants.TAB_INDEX_PATIENT_VITALS));
                studentStatus.setZapNumber(zapNumber);
                myViewPager.setCurrentItem(Constants.TAB_INDEX_PATIENT_VITALS);
            }
        });
        // Draw the list
        myListView.setAdapter(mySimpleCursorAdapter);
        myDBHelper.close();
    }
    // Pass me a tab index (see Constants.java) and I'll return a refrence to that tab.
    private String getFragmentTag(int tagID){
        return "android:switcher:" + R.id.pager + ":" + tagID;
    }
}

AlternateRowColorSimpleCursorAdapter.java

package myPackage;
public class AlternateRowColorSimpleCursorAdapter extends SimpleCursorAdapter {
    public AlternateRowColorSimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
        super(context, layout, c, from, to, flags);
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        View row = super.getView(position, convertView, parent);
        if(position % 2 == 0){
            row.setBackgroundColor(Color.parseColor(Constants.WHITE));
        } else {
            row.setBackgroundColor(Color.parseColor(Constants.LIGHTGREY));
        }
        return row;
    }
}

student_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="match_parent">
    <TextView
        android:id="@+id/student_number_textview"
        android:typeface="monospace"
        android:layout_weight="1"
        android:textStyle="bold"
        style="@style/StudentStyle" />
    <TextView
        android:id="@+id/student_id_textview"
        android:typeface="monospace"
        style="@style/StudentStyle" />
    <ImageView
        android:id="@+id/student_status_button"
        style="@style/studentIconLink"
        android:src="@drawable/status_icon"/>
    <ImageView
        android:id="@+id/student_location_button"
        style="@style/studentIconLink"
        android:src="@drawable/location_icon"/>
</LinearLayout>

可以定义一个回调接口,用于在Adapter中创建的视图与Fragment之间进行通信。

让你的Fragment实现这个接口,并在Adapter的构造函数中传入对Fragment的引用。在适配器的getView()方法中,可以在ImageView上设置要侦听的OnClickListener,然后触发传递到Adapter的回调。注意:您可以在此回调中传回类似 position 的内容,以便知道选择了哪一行的ImageView

最新更新