我正在尝试创建一个代码来单击列表视图项,并显示一个包含文本视图信息的字符串。但是,当我在任何地方点击屏幕时,我只是得到恰好位于列表顶部(屏幕顶部)的值。有人能告诉我这里发生了什么以及我如何纠正它?
行项目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();
}
}
答案 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)
根据您想要的确切行为,您的问题有多种解决方案:
如果您想允许用户点击列表行中的任意位置,则应覆盖onListItemClick()
。此方法接收单击的行的View
参数。您可以使用它来访问该特定行的TextView
。
如果您只希望在用户点击TextView
本身时执行操作,则可以使用您所拥有的代码进行少量更改:使用传递的View
参数进入itemClick()
方法。这是点击的TextView
,因此您可以将其投放到TextView
并从中获取String
。