单击Android中列表视图中的项目

时间:2014-08-16 01:55:53

标签: android listview onitemclicklistener

我正在尝试创建一个代码来单击列表视图项,并显示一个包含文本视图信息的字符串。但是,当我在任何地方点击屏幕时,我只是得到恰好位于列表顶部(屏幕顶部)的值。有人能告诉我这里发生了什么以及我如何纠正它?

行项目XML

  <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"
    android:focusable="true"
    android:onClick="itemClick" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textView1"
        android:text="TextView" />

</RelativeLayout>

这是我的java代码

public class SavedLocationsListTest extends ListActivity{

        DatabaseHandler db = new DatabaseHandler(this);
        SimpleCursorAdapter dataAdapter;

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



        Intent intent = getIntent();

        displayList();

    }

    public void displayList(){

        Cursor cursor=db.getAllLocationsCursor();

        String from [] = new String[] {db.COLUMN_DESCRIPTION, db.COLUMN_LOCATION};
        int to [] = new int[]{R.id.textView1, R.id.textView2};



        dataAdapter = new SimpleCursorAdapter(this, R.layout.row_item, cursor, from, to, 0);


        ListView lv = getListView();
        lv.setAdapter(dataAdapter);



    }

    public void itemClick(View view){



        TextView test = (TextView) findViewById(R.id.textView1);

        String test_string = test.getText().toString();
        Toast please_wait_for_value_msg = Toast.makeText(getApplicationContext(), test_string, Toast.LENGTH_SHORT);
        please_wait_for_value_msg.setGravity(Gravity.TOP|Gravity.CENTER, 0, 250);
        please_wait_for_value_msg.show();

    }


}

4 个答案:

答案 0 :(得分:1)

您的问题出在itemClick here:

TextView test = (TextView) findViewById(R.id.textView1);

当您致电findViewById

时,您正在引用活动中的视图

你可能想打电话:

 TextView test = (TextView) view.findViewById(R.id.textView1);

但是,只有整个ListView项目可以点击时才会这样。如果没有,并且单击视图中的按钮,则需要某种逻辑来确定哪个视图像循环光标并进行比较。有很多选择,但我认为这个答案会让你朝着正确的方向前进。

方法&#34; findViewById&#34;使用Android资源文件&#34; R&#34;查找已在XML中定义的对象。您的原始呼叫相当于:

 TextView test = (TextView) this.findViewById(R.id.textView1);

其中&#34;这个&#34;是指活动。方法&#34; itemClick&#34;提供了对点击的ListView项目的引用作为参数&#34; view&#34; - 这是被触摸的ListView行。

答案 1 :(得分:0)

我建议你在适配器类中编写onItemclick()方法,以便准确选择getView()方法中的特定项

//适配器类

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


        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         convertView = inflater.inflate(R.layout.post_list, parent,
                false);



    TextView test = (TextView)convertView. findViewById(R.id.textView1);





    test.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

    String test_string = test.getText().toString();
    Toast please_wait_for_value_msg = Toast.makeText(getApplicationContext(), test_string, Toast.LENGTH_SHORT);
    please_wait_for_value_msg.setGravity(Gravity.TOP|Gravity.CENTER, 0, 250);
    please_wait_for_value_msg.show();

        }
    });

           return convertView;

}

答案 2 :(得分:0)

您想点击该项目并获取点击的项目textView1,对吧?也许你应该尝试这段代码(在lv.setAdapter(dataAdapter);之后):

lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                //You could use two method to get the clicked item info.
                //1. use click view
                TextView test = (TextView) findViewById(R.id.textView1);
                String test_string = test.getText().toString();
                //2. use cursor
                Cursor cursor = (Cursor) dataAdapter.getItem(position);
                cursor.moveToPosition(position);
                String text = cursor.getString(cursor.getColumnIndex(db.COLUMN_DESCRIPTION));
            }
        });

答案 3 :(得分:0)

根据您想要的确切行为,您的问题有多种解决方案:

  1. 如果您想允许用户点击列表行中的任意位置,则应覆盖onListItemClick()。此方法接收单击的行的View参数。您可以使用它来访问该特定行的TextView

  2. 如果您只希望在用户点击TextView本身时执行操作,则可以使用您所拥有的代码进行少量更改:使用传递的View参数进入itemClick()方法。这是点击的TextView,因此您可以将其投放到TextView并从中获取String