Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使数据库中的ImageView以光标为背景的ListView可单击?_Android_Listview_Simplecursoradapter - Fatal编程技术网

Android 如何使数据库中的ImageView以光标为背景的ListView可单击?

Android 如何使数据库中的ImageView以光标为背景的ListView可单击?,android,listview,simplecursoradapter,Android,Listview,Simplecursoradapter,我有一个我正在使用[modified]SimpleCursorAdapter从数据库中提取的人员列表。然后我在光标上迭代并在我的应用程序的列表视图中打印信息 现在,它是经过编码的,这样当我点击一行时,我的应用程序就会根据从数据库检索到的信息执行一项功能。但是,我想做的是,当我单击行中的ImageView时,我的应用程序将根据从数据库检索到的信息执行相应的功能 我想要的是,当我单击“状态”图像视图时,我希望它执行功能“A”,当我单击“位置”图像视图时,我希望它执行功能“B” 我遇到的问题是在Lis

我有一个我正在使用[modified]SimpleCursorAdapter从数据库中提取的人员列表。然后我在光标上迭代并在我的应用程序的列表视图中打印信息

现在,它是经过编码的,这样当我点击一行时,我的应用程序就会根据从数据库检索到的信息执行一项功能。但是,我想做的是,当我单击行中的ImageView时,我的应用程序将根据从数据库检索到的信息执行相应的功能

我想要的是,当我单击“状态”图像视图时,我希望它执行功能“A”,当我单击“位置”图像视图时,我希望它执行功能“B”

我遇到的问题是在ListView行中隔离ImageView,以便仅在该ImageView而不是整行上使用setOnItemClickListener。我很确定我需要进一步修改我修改过的游标适配器,但我不确定如何修改

以下是我所拥有的:

Home.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};
        // What I want it to be ...
        // int[] toViews = {R.id.student_number_textview, R.id.student_id_textview, R.id.student_status_imageview, R.id.student_location_imageview};
        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 studentIDNumber = subCursor.getString(subCursor.getColumnIndex("studentID"));

                StudentStatus studentStatus = (StudentStatus) getFragmentManager().findFragmentByTag(getFragmentTag(Constants.TAB_INDEX_PATIENT_VITALS));
                studentStatus.setStudentIDNumber(studentIDNumber);

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

修改适配器以添加单击侦听器:

public View getView(final int position, View convertView, ViewGroup parent){
  // your code goes here, then add the following
     ImageView statusButton = row.findViewById(R.id.student_status_button);
     ImageView locationButton = row.findViewById(R.id. student_location_button);
     OnClickListener statusButtonListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            notifyStatusButtonListenerClicked(position);
        }
     };
     OnClickListener locationButtonListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            notifyLicationButtonListenerClicked(position);
        }
    };
  return row;
}

这两个通知都可以通过接口传递给您的活动/片段。只需添加NotifyApplicationButtonListenerClicked(int位置)之类的方法,这些方法将调用实现接口的侦听器上的方法。还要确保删除每行设置的现有setOnItemClickListener侦听器。

修改适配器以添加单击侦听器:

public View getView(final int position, View convertView, ViewGroup parent){
  // your code goes here, then add the following
     ImageView statusButton = row.findViewById(R.id.student_status_button);
     ImageView locationButton = row.findViewById(R.id. student_location_button);
     OnClickListener statusButtonListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            notifyStatusButtonListenerClicked(position);
        }
     };
     OnClickListener locationButtonListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            notifyLicationButtonListenerClicked(position);
        }
    };
  return row;
}

这两个通知都可以通过接口传递给您的活动/片段。只需添加NotifyApplicationButtonListenerClicked(int位置)之类的方法,这些方法将调用实现接口的侦听器上的方法。另外,请确保删除每行设置的现有setOnItemClickListener侦听器。

在游标适配器中创建一个静态类来保存列表的元素(静态不是必需的),然后在getView中初始化这些元素

使用 公共void bindView(视图、上下文上下文、光标)

游标适配器的方法,用于设置列表视图中任意元素的单击侦听器

例如:

public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = mLayoutInflater.inflate(R.layout.list, parent, false);
    ViewHolder viewHolder = new ViewHolder();
    viewHolder.mImage= (ImageView) view.findViewById(R.id.imageview);
view.setTag(viewHolder);
}

@Override
public void bindView(View view, final Context context, final Cursor cursor) {
final ViewHolder viewHolder = (ViewHolder) view.getTag();
viewHolder.mImage.setOnclickListener(new OnClickListener(){
  //do stuff
});
}

public static Class ViewHolder{
  public ImageView mImage;
}

您可以在游标适配器中使用imageButton(这只是一个示例)

创建一个静态类来保存列表的元素(static不是必需的),然后在getView中初始化这些元素

使用 公共void bindView(视图、上下文上下文、光标)

游标适配器的方法,用于设置列表视图中任意元素的单击侦听器

例如:

public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = mLayoutInflater.inflate(R.layout.list, parent, false);
    ViewHolder viewHolder = new ViewHolder();
    viewHolder.mImage= (ImageView) view.findViewById(R.id.imageview);
view.setTag(viewHolder);
}

@Override
public void bindView(View view, final Context context, final Cursor cursor) {
final ViewHolder viewHolder = (ViewHolder) view.getTag();
viewHolder.mImage.setOnclickListener(new OnClickListener(){
  //do stuff
});
}

public static Class ViewHolder{
  public ImageView mImage;
}

您可以使用imageButton(这只是一个示例)

我会查看RecyclerViews,或者,如果没有其他内容,查看ListView的视图持有者(不是用这个来回答您的问题,而是为了效率)。但您需要做的是将
onClickListener
s设置为
视图
s,该视图在
getView
适配器的
getView
部分膨胀。我会查看RecyclerViews,或者,如果没有其他内容,查看ListView的视图持有者(为了效率,我不会回答您的问题)。但您需要做的是将
onClickListener
s设置为
视图
s,该视图在
适配器的
getView
部分膨胀。