java - 为什么我的标题会混淆 onClicklistener

标签 java android

当我向我的 ListView 添加标题时,它弄乱了我的 onclick,它每次都选择了错误的项目。

package ie.example.artur.projectrepeat;

import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class DataListActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

    ListView listView;
    SQLiteDatabase sqLiteDatabase;
    DatabaseClass  database;
    Cursor cursor;
    ListDataAdapter listDataAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.data_list_layout);

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

        listDataAdapter = new ListDataAdapter(getApplicationContext(), R.layout.row_layout);
        listView.setAdapter(listDataAdapter);
        listView.setOnItemClickListener(this);
        database = new DatabaseClass(getApplicationContext());

        sqLiteDatabase = database.getReadableDatabase();

        Cursor cursor=database.getInformation(sqLiteDatabase);

        if (cursor.moveToFirst()) {
            do {

                String id, product_name, category,quantity,importance;
                id = cursor.getString(0);
                product_name = cursor.getString(1);
                category = cursor.getString(2);
                quantity = cursor.getString(3);
                importance = cursor.getString(4);
                DataProvider dataProvider = new DataProvider(id, product_name, category,quantity,importance);
                listDataAdapter.add(dataProvider);
            } while (cursor.moveToNext());
        }
    }
    @Override
    public void onItemClick(AdapterView<?> parent, final View view, final int position, long id) {


        final TextView tv = (TextView) view.findViewById(R.id.product_id);
        AlertDialog.Builder alert = new AlertDialog.Builder(
                DataListActivity.this);
        alert.setTitle("Alert!!");
        alert.setMessage("Are you sure to delete record");
        alert.setPositiveButton("YES", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                //do your work here

                sqLiteDatabase = database.getReadableDatabase();

                DatabaseClass.DeleteInformation(tv.getText().toString(), sqLiteDatabase);

                listView.setAdapter(listDataAdapter);
                listDataAdapter.notifyDataSetChanged();
                listDataAdapter.removeItemAt(position);
                dialog.dismiss();
            }
        });
        alert.setNegativeButton("NO", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                dialog.dismiss();
            }
        });

        alert.show();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        {
            switch (item.getItemId())
            {
                case R.id.home : startActivity (new Intent(this, Main2Activity.class));
                    break;

                case R.id.action_settings : startActivity (new Intent(this, SecondActivity.class));
                    break;
                case R.id.catalogue :startActivity (new Intent(this, ViewAllItems.class));
                    break;

                case R.id.ViewList :startActivity (new Intent(this, DataListActivity.class));
                    break;

                case R.id.find :startActivity (new Intent(this, Main3Activity.class));
                    break;

                case R.id.Update :startActivity (new Intent(this, Edit_Activity.class));
                    break;

            }
            return super.onOptionsItemSelected(item);
        }}
}

当我添加这段代码时,它弄乱了我的应用程序:

LayoutInflater myinflater = getLayoutInflater();
        ViewGroup myHeader = (ViewGroup)myinflater.inflate(R.layout.header, listView, false);
        listView.addHeaderView(myHeader, null, false)

最佳答案

这样做的原因是标题在您的 listview 中算作额外的一项,因此当单击项目时,您会在 position - 1 中获得该项目。
onItemClick 中添加:

 position -= listView.getHeaderViewsCount(); // or position - 1 

关于java - 为什么我的标题会混淆 onClicklistener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39191157/

相关文章:

java - 使用 log4j 动态记录项目名称?

java - 如何使用java apache poi库在Excel中设置日期字段?

android - 加载应用程序时布局膨胀器错误

java - 使用产品口味时,是否需要针对不同版本的应用程序将Java文件分开?

android - "android.view.WindowManager$BadTokenException: Unable to add window"上 buider.show()

java - 如何使取消按钮在 android web View 中链接的 sdk 调用中工作?

java - 在 SWT 浏览器小部件中获取选定的文本

java - 如何放心地将数组插入到 JSONArray 中

java - 没有明显原因的可选数据异常

java - Android在ant编译中包含.jar